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() : 클래스의 소멸자 |
클래스 정의
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 { // 부모 클래스의 public 키워드로 선언된 변수와 메소드를 final로 변경하면 // 자식클래스에서 오버라이딩이 제한된다. |
부모 클래스의 접근 제한자가 public, protected, private 에 따라 출력 결과가 달라짐을 확인해보라. <?php |
생성자 - 자식 클래스가 생성자를 가지고 있지 않은 경우, 자동으로 부모 클래스의 생성자를 호출한다. - 자식 클래스가 생성자를 가지고 있는 경우 부모 클래스의 생성자가 암묵적으로 호출되지 않는다. - 생성자는 2개(ex, 인자 있는것과 없는 것) 생성하면 에러가 발생한다. |
<?php |
'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 |