phpclass/객체모델2002. 12. 21. 15:14
소멸자(Destructors)
소멸자의 역할
생성된 객체가 소멸되기 직전에 자동으로 불려지는 함수이며 주로 객체에 관련된 메모리를 정리하기 위하여 수행됩니다.
소멸자의 동작
클래스가 상속관계에 있을 때에 각 클래스에 있는 소멸자의 실행순서는 생성자와 반대로 동작하게 됩니다. 즉, 파생클래스의 소멸자가 먼저 실행된 다음에 부모클래스의 소멸자가 순서대로 실행됩니다.
소멸자의 특징
인자와 리턴값이 없으며 상속되지 않습니다.
Zend 엔진 1.0에서의 소멸자
PHP3 또는 Zend 엔진 1.0이 탑재된 PHP4에서는 소멸자를 지원하지 않습니다. 따라서 객체가 소멸할 때 처리해야 할 것이 있다면 임시방편적으로 register_shutdown_function() 함수를 이용하였습니다. 그러나 register_shutdown_function() 함수는 현재 문서의 요청(request)가 종료되는 시점에서 불려지는 PHP 내장함수로 특정 객체의 소멸과는 관계없다는 것에 유의해야 할 것입니다.
Zend 엔진 2.0에서의 소멸자 지원
비록 Zend 엔진 1.0에서도 register_shutdown_function() 함수를 이용하여 소멸자와 유사한 일을 할 수 있었지만 클래스 내의 일은 클래스 내에서 처리한다는 캡슐화 개념하고는 거리가 먼 전역적인 작업이 될 수밖에 없었습니다.
Zend 엔진 2.0에서는 소멸자를 공식 지원하기 때문에 객체를 처리하는 능력이 한층 높아지게 되었습니다. 소멸자를 통하여 디버깅에 대한 메시지들을 기록할 수 있게 되었고, 데이터 베이스 연결들을 닫는 등의 관련작업을 깨끗이 마무리할 수 있게 되었습니다.
복사가 아닌 참조를 바탕으로 설계된 Zend 엔진 2.0에서는 객체의 마지막 참조가 소멸될 때 해당 객체가 메모리로부터 해제됩니다. 소멸자는 객체가 메모리로부터 해제되기 직전에 호출되어 수행되며 소멸자명은 __destruct()으로 단일화되어 있으며 인자없이 호출됩니다.
[code php;gutter:false] <?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = 'MyDestructableClass';
}

function __destruct() {
print'Destroying'. $this->name. "\n";
}
}

$obj = new MyDestructableClass();
?> [/code]
생성자와는 다르게 부모클래스의 소멸자가 자동적으로 호출되지는 않습니다. 부모클래스의 소멸자를 실행하기 위해서는 아래의 예와 같이 명시적으로 부모클래스의 소멸자를 호출하여야 합니다.
[code php;gutter:false] <?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "Destroying " . $this->name . "\n";
}
}

class ChildDestructableClass {
function __destruct() {
parent::__destruct();
}
}

$obj = new ChildDestructableClass();
?> [/code]

Posted by 방글24