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); ?> |