■ 클래스의 기초
클래스는 class 키워드로 시작하여 클래스 이름이 정의되고, 다음 중괄호 안에는 클래스의 속성과 메소드를 정의합니다. 클래스 이름은 다음과 같은 규칙을 따릅니다.
√ 첫 글자가 문자나 밑줄로 시작해서 a ~ z, A ~ Z, 0 ~ 9, 언더라인( _ )이 붙는 127부터 255까지 길이인 클래스 이름을 갖습니다. √ 정규표현식 : ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$ |
클래스 안에는 상수와 변수, 함수를 사용할 수 있고, 메소드가 객체 컨테스트에서 호출되는 경우 자기 자신의 객체를 나타내는 $this 를 사용하여 호출합니다. $this 를 붙이지 않으면 일반 변수(로컬 변수)로 처리해 버립니다.
Tip : php5.3부터 변수를 사용하여 클래스 이름을 정의할 수 있습니다.
ex #01) |
<?php class test { // 다음 변수를 멤버 변수라 부릅니다. var $name = "Wicked"; var $email = "yinglong200@me.com"; function display() { echo $this -> name."<br/>\n"; echo $email; } } $method = new test; $method -> display(); // 출력 : Wicked ?> |
ex #02) |
<?php class test { var $name = "Wicked"; var $email = "yinglong200@me.com"; function Cat() { echo $this -> name." "; echo $this -> email; } function display() { $this -> Cat(); } } $method = new test; $method -> display(); // 출력 : Wicked yinglong200@me.com ?> |
■ new 키워드
new 키워드는 클래스의 인스턴스를 만들기 위해 사용합니다. new 키워드를 사용하여 클래스를 초기화하면 해당 클래스의 변수나 메소드를 호출하기 위해 -> 를 붙여 참조할 수 있습니다.
ex #01) |
<?php class test { } $instance01 = new test; $instance02 = new test; ?> |
ex #02) |
<?php |
ex #03) |
<?php class test { function test() { } function profile($name) { echo "name : $name "; } } $instance01 = new test(); $instance01 -> profile("Wicked"); $instance02 = new test(); $instance02 -> profile("Miso"); // 출력 name : Wicked name : Miso ?> |
다음 예제처럼 객체를 참조하여 할당할 수도 있습니다.
ex #04) |
<?php class test { function test() { } function profile($name) { echo "name : $name "; } } $instance = new test(); $a =& $instance; $a -> profile("Wicked"); // 출력 : name : Wicked ?> |
■ extends 키워드
extends 키워드를 사용한다면 다른 클래스의 메소드와 속성을 상속(또는 확장) 할 수 있습니다. 단, 하나의 클래스만 상속할 수 있지만 다중 상속은 할 수 없습니다. 그러나 다른 클래스의 내용을 계승하여 새로운 클래스를 만들어 원래의 클래스를 수정하지 않고 확장 할 수 있다는 장점이 있습니다.
ex #01) |
<?php class test { var $name = "Wicked"; } /* test 클래스는 부모 클래스라 하고, 상속 받은 Simple 클래스를 자식 클래스라 합니다. test 클래스로 simple 클래스를 확장한 것이므로 test 클래스의 멤버 변수나 메소드도 사용할 수 있습니다. */ class simple extends test { function profile() { echo "name : ".$this -> name; } } $a = new simple(); $a -> profile(); // 출력 : name : Wicked ?> |
ex #02) |
<?php class test { var $name = "Wicked"; function profile() { echo "name : ".$this -> name; } } class simple extends test { function output() { $this -> profile(); } } $a = new simple(); $a -> output(); // 출력 : name : Wicked ?> |
■ public, protected, private 속성
클래스의 멤버 변수를 속성이라 부르고, 속성을 정의하려면 public, protected, private 속성 중 하나의 키워드를 정의한 다음에 일반 변수를 선언합니다. 이 속성은 다음의 역할을 합니다.
√ public : 클래스 내부, 서브 클래스, 그리고 클래스 외부에서 사용할 수 있고, var를 선언하거나 생략하면 public 을 선언한 것으로 간주합니다. √ protected : 클래스 내부, 서브 클래스에서만 사용할 수 있습니다. √ private : 클래스 내부에서만 사용할 수 있습니다. |
ex #01) |
<?php class test { // 속성은 php5.1.3부터 사용할 수 있습니다. public $name = "Wicked"; public function profile() { echo "name : ".$this -> name; } } $a = new test(); $a -> profile(); // 출력 : name : Wicked ?> |
ex #02) |
<?php class test { // 속성은 php5.1.3부터 사용할 수 있습니다. public $name = "Wicked<br/>"; public function profile() { echo "name : ".$this -> name; } } class simple extends test { public function output() { $this -> profile(); } } $a = new test(); $a -> profile(); // 출력 : name : Wicked $a = new simple(); $a -> output(); // 출력 : name : Wicked ?> |
다음은 protected 사용의 예입니다.
ex #03) |
<?php class test { // 속성은 php5.1.3부터 사용할 수 있습니다. protected $name = "Wicked<br/>"; protected function profile() { echo "name : ".$this -> name; } } // 클래스 내부와 서브 클래스에서만 사용할 수 있게 // 정의하였으므로 클래스 밖에서는 사용할 수 없습니다. $a = new test(); $a -> profile(); // 출력 : ?> |
■ const 키워드
const 키워드를 정의하면 클래스 상수를 만들 수 있습니다. 다만, 값을 변경할 수 없는 상수를 클래스에 정의할 수 있지만 변수의 값에(self::, parent::, static:: 같은)키워드를 지정할 수 없습니다.
ex #01) |
<?php class test { // 속성은 php5.1.3부터 사용할 수 있습니다. const name = "Wicked<br/>"; function profile() { echo "name : ".self::name; } } class simple extends test { function output() { $this -> profile(); } } $a = new test(); $a -> profile(); // 출력 : name : Wicked $b = new simple(); $b -> output(); // 출력 : name : Wicked echo $a::name; // 출력 : Wicked ?> |
ex #02) |
<?php class test { const MY_NAME = "Wicked"; } echo test::MY_NAME; // 출력 : Wicked ?> |
■ 생성자(__construct( ))와 소멸자(__destruct( ))
클래스의 생성자 __construct() 메소드를 선언할 수 있습니다. 생성자 메소드를 가진 클래스는 새로운 객체가 생성될 때마다 이 메소드를 호출합니다. 그러면 해당 객체를 사용하기 전에 초기화를 해줍니다.
콘스트럭터(__construct( ))라고 부르는 생성자 메소드는 콘스트럭터 인수에 값을 넘기려면 초기화할 때 클래스 인수로 지정하면 되고, 소멸자 디스트럭터(__destruct( ))는 콘스트럭터의 역으로 객체가 소멸할 때 실행되는 메소드입니다. 객체가 참조할 필요가 없다면 자동 소멸됩니다.
ex #01) |
<?php class test { var $name = null; var $email = null; var $age = null; function __construct($a, $b, $c) { $this -> name = $a; $this -> email = $b; $this -> age = $c; } function profile() { printf("name %s(%s) %s<br/>", $this -> name, $this -> age, $this -> email); } } $a = new test("Wicked", "10", "id01"); $b = new test("Miso", "20", "id02"); $c = new test("Hayate", "30", "id03"); $a -> profile(); $b -> profile(); $c -> profile(); /* 출력 : name : Wicked(id01) 10 name : Miso(id02) 20 name : Hayate(id03) 30 */ ?> |
■ static 키워드
static 키워드는 객체의 인스턴스를 생성하지 않고도 호출할 수 있게 해줍니다. 보통 멤버 변수를 사용하기 위해 $this 와 -> 를 사용해야 하지만 static 키워드가 선언된 메소드는 그럴 필요 없이 :: 로 접근할 수 있습니다.
static 키워드로 선언도니 메소든느 반대로 $this 와 -> 로 엑세스할 수 없고, 메소드 내부에서도 이용할 수 없지만 static 이 선언된 변수를 내부에서 이용하려면 self 를 이용하면 됩니다.
static가 아닌 메소드를 정적으로 호출하면 E_STRICT 레벨의 경고가 발생합니다.
TIP : php5.3부터 변수를 사용하여 클래스를 참조할 수 있지만 변수의 값에 (self::parent::, static:: 같은) 키워드를 지정할 수 없습니다.
ex #01) |
<?php class test { static $name = "Wicked"; static $email = "yinglong200@me.com"; static $age = "28"; public static function profile() { printf("name %s(%s) %s<br/>", self::$name, self::$age, self::$email); } } echo test::$name; // 출력 Wicked test::profile(); // 출력 : name Wicked(28) yinglong200@me.com ?> |
php5.3부터 변수를 사용하여 클래스를 호출할 수 있습니다.
ex #02) |
<?php class test { static $name = "Wicked"; static $email = "yinglong200@me.com"; static $age = "28"; public static function profile() { printf("name %s(%s) %s<br/>", self::$name, self::$age, self::$email); } } $classname = "test"; echo $classname::$name; // 출력 Wicked $classname::profile(); // 출력 : name Wicked(28) yinglong200@me.com ?> |
■ self(또는 parent) 키워드
self(또는 parent) 키워드를 사용하면 정적 상속 컨텍스트에서 호출 클래스를 참조할 수 있습니다. self 키워드는 해당 메소드가 정의된 클래스 이름을 가져 올 수 있고, get_chlled_class() 함수를 사용하면 클래스 이름을 문자열로 가져옵니다.
static:: 의 차이는 정적 속성만 참조할수 없다는 점을 제외하면 동일하고, parent:: self:: 같은 키워드를 사용하여 요청자의 정보를 전송할 수 있습니다.
ex #01) |
<?php class test { public static function who() { echo __CLASS__; } public static function output() { self::who(); } } class simple extends test { public static function who() { //... } } simple::output(); // 출력 : test ?> |
ex #02) |
<?php class test { function __construct($child) { echo "I Was called by " . $child . "<br/>"; } } class simple extends test { function __construct() { parent::__construct(__CLASS__); } function output() { echo "I am class " . __CLASS__; } } $a = new simple; // 출력 : I was called by simple $a -> output(); // 출력 : I am class simple ?> |
■ final 키워드
final 키워드는 php5.0부터 사용할 수 있습니다. final 키워드를 클래스나 메소드에 정의하면 정의된 메소드는 자식 메소드에 재정의할 수 없고, 클래스 자체를 final로 정의된 경우 이 클래스를 상속에 사용할 수 없습니다. public 과 같은 속성에 final로 선언할 수 도 없습니다.
ex #01) |
<?php final class test { public function profile() { echo "name : Wicked"; } } class simple extends test { function output() { $this -> profile(); } } $a = new simple(); $a -> output(); // 출력 : Fatal error: Class simple may not inherit from final class (test) in ...\ex19.php on line 16 ?> |
ex #02) |
<?php final class test { public function profile() { echo "name : Habony"; } } $a = new test(); $a -> output(); // 출력 : name : Habony ?> |
■ 범위 정의 연산자 더블 콜론( :: )
범위 정의 연산자 더블 콜론(::)은 static, 상수, 재정의된 클래스의 속성과 메소드에 액세스할 때 상요합니다. 클래스 내부에서 액세스하고자 할 때는 self:: 나 parent::, static::를 사용하면 됩니다.
ex #01) |
<?php class test { const CONST_VALUE = 'Wicked'; } echo test::CONST_VALUE; // 출력 : Wicked ?> |
ex #02) |
<?php class test { const CONST_VALUE = 'my name is'; } class simple extends test { public static $my_static = 'Wicked;'; public static function my_name() { echo parent::CONST_VALUE." "; echo self::$my_static."<br/>"; } } // php5.3부터 변수를 사용하여 클래스를 참조할 수 있습니다. $classname = 'simple'; echo $classname::my_name(); // 출력 : my name is Wicked; simple::my_name(); // 출력 : my name is Wicked; ?> |
'PHP > PHP Programming' 카테고리의 다른 글
[PHP] 디렉터리 열기 함수 (0) | 2015.04.19 |
---|---|
[PHP] 세션 쿠키 설정 함수 (0) | 2015.04.08 |
[PHP] 상수의 정의 (0) | 2015.03.31 |
[PHP] 가변변수 (0) | 2015.03.29 |
[PHP] 정적변수 (0) | 2015.03.29 |