PHP 주요레퍼런스/객체지향 프로그래밍

소멸자 __destruct()

웹 개발자의 비상 2011. 10. 24. 13:53
function __destruct()
인스턴스의 소멸되기 시점에 자동호출된다.

__construct와 반대개념이다.
이미 생성된 인스턴스를 더이상 참조하지 않을때 해당 인스턴스가 소멸되기 바로전에 호출한다.

일단 스크립트의 실행이 종료되면 스크립트에서 생성했던 인스턴스는 더 이상 참조되거나 사용되지 않는다. 그러므로 소멸자가 정의되어 있다면 스크립트 실행의 마지막 시점에서 인스턴스가 메모리로부터 제거되기 전에 인스턴스의 소멸자가 호출된다.

그러나 스크립트가 종료되기 전이라도 이미 생성된 인스턴스에 강제로 NULL값을 할당하거나 unset()과 같은 함수를 호출하면 스크립트 종료 전이라도 해당 인스턴스의 소멸자를 호출할 수 있다.

예제

<?
class Time {
private $hour;
private $minute;
private $second;

function __construct($hour, $minute, $second) {
$this->setTime($hour, $minute, $second);
echo "생성자 호출!\n";
}

function __destruct() {
echo "소멸자 호출!\n";
}

public function setTime($hour, $minute, $second) {
$this->hour = ($hour >= 0 && $hour < 24) ? $hour : 0;
$this->minute = ($minute >= 0 && $minute < 60) ? $minute : 0;
$this->second = ($second >= 0 && $second < 60) ? $second : 0;
}

public function ToUniversalTime() {
return sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second);
}
}

echo "객체 생성 전!\n"; //객체 생성 전!

$time = new Time(22, 57, 38); //생성자 호출!

echo "객체 생성 후!\n"; //객체 생성 후!

echo $time->ToUniversalTime() . "\n"; //22:57:38

echo "스크립트 종료!"; //스크립트 종료!

// 소멸자 호출!
?>



예제-소멸자 강제 호출

<?
class Time {
private $hour;
private $minute;
private $second;

function __construct($hour, $minute, $second) {
$this->setTime($hour, $minute, $second);
echo "생성자 호출!\n";
}

function __destruct() {
echo "소멸자 호출!\n";
}

public function setTime($hour, $minute, $second) {
$this->hour = ($hour >= 0 && $hour < 24) ? $hour : 0;
$this->minute = ($minute >= 0 && $minute < 60) ? $minute : 0;
$this->second = ($second >= 0 && $second < 60) ? $second : 0;
}

public function ToUniversalTime() {
return sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second);
}
}

echo "객체 생성 전!\n"; //객체 생성 전!

$time = new Time(22, 57, 38); //생성자 호출!

echo "객체 생성 후!\n"; //객체 생성 후!

$time = NULL; //소멸자 호출!

// echo $time->ToUniversalTime() . "\n"; // 이미 객체가 소멸되었으므로 에러가 발생한다.

echo "스크립트 종료!"; //스크립트 종료!
?>

728x90

'PHP 주요레퍼런스 > 객체지향 프로그래밍' 카테고리의 다른 글

class 상속과 생성자  (0) 2022.07.22
__set / __get 메소드  (0) 2011.10.24
생성자 __constructor()  (0) 2011.10.24
$this 참조  (0) 2011.10.24
멤버 접근 제한자  (0) 2011.10.24