PHP 5 에서는 클래스의 생성자 메서드를 선언하는것을 허용합니다. 클래스는 새로이 생성된 오브젝트마다 자신의 생성자 메서드를 호출합니다. 그래서, 객체 초기화를 위해 사용할수 있습니다.
Note: 부모 생성자는 자식클래스가 생성자를 가지고 있을경우 내부적으로 호출되지 않습니다. 부모 생성자를 호출하기 위해서는 자식 생성자 내에서 parent::__construct() 호출이 필요합니다. 자식이 생성자를 가지지 않는다면 다른 일반적인 클래스 메서드처럼 부모클래스의 생성자가 상속됩니다(private 메서드는 제외).
Example #1 생성자 사용하기
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
하위 호환성을 위해, PHP 5 가 클래스에서 __construct() 함수를 찾지 못할경우, 그리고, 부모 클래스로부터 상속하지 않은 경우, 클래스이름에 기반한 예전방식의 생성자를 함수를 찾게 될것입니다. 호환성 문제가 생길수 있는 케이스는 클래스가 __construct() 메서드를 가진경우 해당 메서드를 다른 의미로 사용하는 경우 입니다.
다른 메서드와는 다르게, __construct() 가 부모의 __construct()와는 다르게 재정의 되어도
E_STRICT
에러메시지를 발생하지 않습니다.
PHP 5.3.3 이후로 네임스페이스 클래스의 마지막 엘리먼트명을 더이상 생성자로 다루지 않습니다. 이변경은 비네임스페이스 클래스들에게는 영향을 미치지 않습니다.
Example #2 네임스페이스 클래스의 생성자
<?php
namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method as of PHP 5.3.3
}
}
?>
PHP 5는 C++과 같은 객체지향 언어에 존재하는 비슷한 개념의 소멸자를 선보였습니다. 소멸자 메서드는 더이상 객체를 참조하지 않거나, 종료가 일어나는동안 호출될수 있을 것입니다.
Example #3 소멸자 예제
<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
생성자처럼, 부모 소멸자는 묵시적으로 호출되지 않습니다. 부모 소멸자를 호출하기 위해서는, 소멸자 내부에서 parent::__destruct() 를 명시적으로 호출해 줘야 합니다. 또한 생성자처럼, 자식 클래스가 소멸자를 가지지 않는다면 부모의 것을 상속합니다.
소멸자는 exit() 로 스크립트 실행이 중단되더라도 실행됩니다. 소멸자 내부에서 exit() 를 호출 하는 것은 남은 종료 루틴을 막게 됩니다.
Note:
스크립트가 종료되는 동안에 소멸자가 호출된 경우 HTTP 헤더는 이미 보내진 뒤입니다. 스크립트가 종료될때의 작업디렉터리는 SAPI 마다 다를수 있습니다.(예를 들면 Apache)
Note:
소멸자 내부에서 예외를 발생시키려고 시도할경우(스크립트 종료시점) fatal error 를 발생시킵니다.