PHP 매뉴얼
이전 | 13. 장. 클래스와 객체 | 다음

# `생성자`

경고
PHP 3와 PHP 4에서 생성자(constructor)는 서로 다르게 동작한다. PHP 4의 문법이 강력히 추천하는 바이다.

생성자는 `new`를 사용하여 클래스의 새 인스턴스를 생성할때 자동으로 호출되는 클래스 내의 함수를 말한다. PHP 3에서는 클래스의 이름과 동일한 함수가 생성자가 된다. PHP 4에서는 클래스가 선언될때의 클래스명과 동일한 이름을 갖는 함수가 생성자가 된다. - 차이는 미묘하지만 매우 중요하다 (다음 글을 보세요).

`<?php // PHP 3와 PHP 4에서 작동함 class Auto_Cart extends Cart { function Auto_Cart() { $this->add_item ("10", 1); } } ?>`

위 코드는 Cart와 같은 Auto_Cart 클래스를 선언하고 "new"로 새로운 Auto_Cart가 생성될때마다 상품번호 "10"인 아이템 하나를 갖는 카트로 초기화하는 생성자를 만든다. 생성자는 인자를 취할수 있고 이런 인자로 인해 생성자를 더 유용하게 만들어주지만 없을수도 있다. 인자가 없는 클래스를 사용하려면 생성자의 모든 인자는 기본값을 제공해 줄수 있다.

`<?php // PHP 3와 PHP 4에서 동작함. class Constructor_Cart extends Cart { function Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Shop the same old boring stuff. $default_cart = new Constructor_Cart; // Shop for real... $different_cart = new Constructor_Cart("20", 17); ?>`

생성자에서 발생할수 있는 에러 메시지를 보이지 않게 하려면 `@`연산자를 사용할수 있다.즉, `@new`를 쓸수 있다.

경고
PHP 3에서 파생 클래스와 생성자는 많은 제약을 갖는다. 다음 예제 코드는 이런 제약을 이해하기 위해 주의깊게 살펴봐야할것이다.

`<?php class A { function A() { echo "I am the constructor of A.<br>\n"; } } class B extends A { function C() { echo "I am a regular function.<br>\n"; } } // PHP 3에서는 어떤 생성자도 호출되지 않는다. $b = new B; ?>`

위 예제 코드는 PHP 3에서는 어떤 생성자도 호출되지 않는다. PHP 3의 규칙은 : '생성자는 클래스와 같은 이름을 갖는 함수이다'. 클래스명 이 B이고 이 클래스에서는 B()함수가 없으므로 아무일도 일어나지 않는다.

PHP 4에서는 다른 규칙이 적용되어서 이런 규칙의 문제가 해결되었다: 클래스가 생성자를 갖지 않을때, 원래 클래스에서 생성자가 존재하면 그 생성자가 호출된다. 위 예제 코드는 PHP 4에서 'I am the constructor of A.<br>' 를 출력할것이다.

`<?php class A { function A() { echo "I am the constructor of A.<br>\n"; } function B() { echo "I am a regular function named B in class A.<br>\n"; echo "I am not a constructor in A.<br>\n"; } } class B extends A { function C() { echo "I am a regular function.<br>\n"; } } // This will call B() as a constructor. $b = new B; ?>`

PHP 3에서 클래스 A의 함수 B()는 의도하지 않았을지라도 즉시 클래스 B의 생성자가 될것이다. PHP 3의 규칙: '생성자는 클래스와 같은 이름을 갖는 함수이다'. PHP 3에서는 그 함수가 클래스 B에서 선언되었는지 또는 거기서 상속되었는지는 상관하지 않는다.

위 규칙의 문제점을 PHP 4에서는 다음과 같은 규칙으로 해결했다 : '생성자는 그것이 선언된 클래스와 같은 이름을 갖는 함수이다'. 따라서 PHP 4는 클래스 B가 생성자를 갖지 않으므로 원래 클래스의 생성자가 호출되어서 'I am the constructor of A.<br>'를 출력한다.

경고
PHP 3와 PHP 4 모두 파생 클래스의 생성자에서 자동으로 원래 클래스의 생성자를 호출하지 않는다. 적절하게 상단에 생성자 호출을 전달할 책임은 당신에게 달려있다.

> 참고: PHP 3나 PHP 4에서는 소멸자(destructor)를 지원하지 않는다. 대신에 이런 소멸자의 기능을 수행하기 위해 register_shutdown_function() 함수를 사용할수 있다.

소멸자는 객체가 파괴될때, unset()함수나, 단순히 현재 영역을 벗어남으로써 자동으로 호출되는 함수이다. PHP에서는 소멸자가 없다.

이전 | 처음으로 | 다음
`extends` | 위로 | `::`