728x90

Class 란 객체(object)를 만들기 위한 설계도이다.

객체지향에 대한 개념을 잘 이해하고자 한다면, 유투브 강좌 "자바의 정석"을 추천한다.


PHP Class 를 이용하면 함수 이상으로 코드를 재사용할 수 있다.


PHP의 모든 함수와 클래스는 전역이다.
함수가 내부에서 정의되었더라도 외부에서 호출할 수 있으며, 반대도 성립한다.
PHP는 함수 오버로딩(overloading)을 지원하지 않으며, 함수 정의를 해제하거나 이미 선언된 함수를 다시 선언할 수 없다.


이중 밑줄(__) 로 시작하는 PHP 함수를 매직 메소드(Magic Method)라 부른다.

Magic Method 에는 __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 그리고 __clone() 이 있다.


  __construct() : 클래스의 생성자
     새로운 오브젝트가 생성(인스턴스화)될때마다 이 메소드를 호출

  __destruct() : 클래스의 소멸자
     특정 오브젝트에의 모든 참조(레퍼런스)가 삭제된 직후 도는 오브젝트가 명시적으로 파기된 직후 호출
  __set() – 엑세스 할 속성에 데이터를 쓸 때 사용 (저장)
  __get() – 엑세스 할 속성에서 데이터를 읽을 때 사용 (출력)
  __isset() – 엑세스할 속성에 isset() 또는 empty() 를 호출하여 트리거 됨 (확인)
  __unset() – 엑세스 할 속성에 unset() 를 사용할 경우 호출 (삭제)


클래스 정의

class 를 정의하기 위해서는 class 키워드를 사용하여 정의하여야 한다.

Login 으로 클래스를 정의할 수도 있지만 클래스 라는 걸 인지하기 쉽도록 LoginClass 로 정의했다.


<?php

// 클래스명은 첫자는 대문자로 시작하고, 파일명과 동일하게 한다.

class LoginClass { // LoginClass 클래스 선언
    public $email, $name;  //public으로 변수 선언

    function __construct(){       // 클래스의 생성자 선언
        $this->name = "Link2me"; // 객체가 생성되면서 name 속성에 Link2me 대입
    }

    function __destruct(){
        echo "Login Class 객체 소멸";
    }

    function UserIDJoinCheck($userID) { // 함수(메소드) 선언
        if(!isset($userID) || empty($userID)) {
            return '-1';
        } else {
            global $db; //global 키워드를 사용하여 변수에 선언할 경우 함수 밖의 변수를 참조할 수 있다.          
            $userID = preg_replace("/[\s\t]+/","", $userID); // 공백이나 탭 제거(사용자 실수 방지)

            $sql = "select id, count(id)
from member ";
            $sql.= "where id= '".$userID."' ";
            if($result = mysql_query($sql,$db)) { //성공
                $row = mysql_fetch_row($result);
                if($row[1] == '0') return 0; // userID 미가입
                return $row[1];
            } else {
                return '-1';
            }
        }
    }


    static function MyName(){
        echo "My name is Link2me.";
    }

}
?>


접근 제한자

public  
- 클래스 안, 밖에서 접근이 가능하다.
- 키워드를 아무것도 적지 않았을 경우에는 public 이 기본 값으로 적용된다.

protected
- 클래스 안에서만 접근이 가능하지만 하위 클래스로 상속이 가능하다.
  하지만 하위 클래스 외부에선 접근이 불가하다.

private
- 클래스 안에서만 접근이 가능하며, 상속이 안된다.


객체 생성

객체를 생성하려면 new 키워드를 사용한다.

$object = new LoginClass;  // new 키워드로 LoginClass 객체 생성(객체화, 인스턴스화)


객체 접근

클래스 메서드 내에서 비정적 객체(object)의 속성(property)에 접근하는 방법은 객체연산자( -> )를 사용한다.

$data = $object->UserIDJoinCheck($id);

속성이나 함수(메소드)에 접근할 때에는 $ 를 붙이지 않도록 하라. $를 붙이면 해당 변수를 가리키기 때문에 엉뚱한 결과가 발생할 수 있음을 명심하자.


Class 내에서 다른 메소드(함수)에 접근할 때에는 $this 를 사용한다.

$this는 해당 클래스를 가리킨다.

$this->val 는  해당 클래스의 $val 변수에 접근한다는 것을 의미한다.


정적(static) 메소드의 호출은 객체 연산자(->) 가 아닌 더블콜론(::)으로 호출된다.

더블콜론은 static 이나 constant와, 클래스의 재정의된 프로퍼티나 메서드에 접근 할 수 있도록 해주는 토큰이다.

LoginClass::MyName();



객체 복제

new로 객체를 생성하여 매개 변수로 넘길 때는 참조로 넘어간다.
따라서 새로운 메모리를 할당하는 것이아닌 객체의 주소값을 전달하는 것이다.

$object1 = new LoginClass;

$boject2 = $object1;


객체 복사를 해서 적용하거나 테스트를 안해봐서 세부적인 사항은 나중에 추가할 생각이다.


접근 제한자 : 멤버변수나 메소드 앞에 지정하여 클래스 외부에서의 참조나 실행을 제한 할 때 사용한다.

 - 접근 제한자가 정의되어 있지 않으면, 기본으로 public 으로 가정한다.

 - public : 외부에서 참조할 수 있음.

 - private : 변수를 선언한 클래스 안에서만 참조할 수 있다.

 - protected : 변수를 선언한 클래스와 상속 받은 클래스에서 참조할 수 있다.

 - final 메소드 : 서브 클래스가 부모 클래스의 메소드를 대체하는 걸 원치 않을 경우에는 final 키워드를 사용한다.

   final function copyright(){

   echo "Copyright Link2me";

   }


상속(inheritance)
: 클래스를 정의할 때 다른 클래스의 내부 데이터(멤버변수)나 메소드를 이어받어 새로운 클래스를 작성할 수 있는 기능(코드의 재활용성)


extends 키워드를 사용하여 다른 클래스의 메소드와 멤버변수(속성)을 상속할 수 있다.

class 자식 클래스명 extends 부모클래스명 {

   처리 코드

}


class ParentClass {
    var $name = "개발자";
}

class SubClass extends ParentClass{
    function info(){
        echo "name : ".$this->name; // 부모 클래스의 변수를 상속 받는다.
    }
}

$childObject = new SubClass();
$childObject -> info();


// 부모 클래스의 public 키워드로 선언된 변수와 메소드를 final로 변경하면

// 자식클래스에서 오버라이딩이 제한된다.


부모 클래스의 접근 제한자가 public, protected, private 에 따라 출력 결과가 달라짐을 확인해보라.

<?php
    class ParentClass{
        public $name = "홍길동";
        
        protected function showInfo(){
            echo "name : ".$this->name;
        }
        
        public function output(){
            echo "ParentClass ";
            $this->showInfo();
        }
    }
    
    
    class SubClass extends ParentClass{
        public function output(){
            echo "subClass ";
            $this->showInfo();
        }
    }
    
    $parentObject = new ParentClass();
    $parentObjec->output();
    
    echo '<br />';
    
    $childObjec = new SubClass();
    $childObjec->output();
?>

생성자

 - 자식 클래스가 생성자를 가지고 있지 않은 경우, 자동으로 부모 클래스의 생성자를 호출한다.

 - 자식 클래스가 생성자를 가지고 있는 경우 부모 클래스의 생성자가 암묵적으로 호출되지 않는다.
 - 부모클래스의 생성자를 실행하기위해서는 자식 클래스내에서 parent::__construct() 를 호출하여야 한다.

 - 생성자는 2개(ex, 인자 있는것과 없는 것) 생성하면 에러가 발생한다.

<?php
class people {
    public $height;
    public $weight;
    public function __construct($height, $weight) {
        $this -> height = $height;
        $this -> weight = $weight;
    }
}

class subPeople extends people {
    public function __construct($height, $weight) {
        parent::__construct($height, $weight);
    }
}

$people = new people(170, 50);
$subPeople = new subPeople(180, 60);

print_r($people);
print_r($subPeople);
?>


728x90

'Web 프로그램 > PHP 문법' 카테고리의 다른 글

[PHP] PHP 문자열 찾기  (0) 2017.11.14
[PHP] 배열에만 동작하는 foreach 문  (0) 2017.01.26
PHP isset 과 empty 설명  (1) 2016.04.27
PHP 대체 문법  (0) 2016.04.05
[PHP] switch 문  (0) 2015.06.01
블로그 이미지

Link2Me

,