생성자 및 소멸자 체인
일반적인 객체지향언어에서 보면 클래스 객체를 생성할 때마다 생성자가 실행되는데 객체를 생성할 때에 먼저 부모클래스의 생성자를 호출한 후 자식클래스의 생성자를 호출합니다.
그러나 PHP3 또는 PHP4 스크립트에서는 마지막으로 파생된 클래스의 생성자만을 호출하고 그 이상의 부모클래스의 생성자는 실행하지 않고 종료합니다. PHP에서의 생성자 동작 원리는 좀 더 복잡합니다. 자세한 것은 메뉴 "핍클래스홈>>클래스 사용법>>생성자"를 참조하기 바랍니다.
따라서 클래스를 정의할 때는 연속된 생성자 실행(생성자 체인)을 위해 반드시 생성자를 정의하고 그 생성자 내에서 부모클래스에 대한 생성자를 호출할 필요가 있습니다.
반면 클래스 객체가 파괴될 때마다 클래스 소멸자가 실행되는데 프로그램은 먼저 자식클래스의 소멸자를 호출한 후 부모클래스의 소멸자를 호출합니다.
"후키라이브러리"를 이용하여 클래스를 정의하면 생성자 및 소멸자 체인을 자동으로 구현할 수 있습니다.
[code php;gutter:false] /*
파일명 class.c.php
조상클래스 c 정의
*/

classdefine("
class cInterclass {}
");

class c extends cInterclass {
function c() {
.... 생성자에서 처리할 내용을 이곳에 작성합니다.
}

function _c() {
.... 소멸자에서 처리할 내용을 이곳에 작성합니다.
}

.... 이곳에 조상클래스 c의 멤버함수 및 데이터멤버를 정의합니다.
}

/*
파일명 class.b.php
부모클래스 b 정의
*/

blassdefine("
class bInterclass extends c {}
");

class b extends bInterclass {
function b() {
.... 생성자에서 처리할 내용을 이곳에 작성합니다.
}

function _b() {
.... 소멸자에서 처리할 내용을 이곳에 작성합니다.
}

.... 이곳에 부모클래스 b의 멤버함수 및 데이터멤버를 정의합니다.
}

/*
파일명 class.a.php
자식클래스 a 정의
*/

classdefine("
class aInterclass extends b {}
");

class a extends aInterclass {
function a() {
.... 생성자에서 처리할 내용을 이곳에 작성합니다.
}

function _a() {
.... 소멸자에서 처리할 내용을 이곳에 작성합니다.
}

.... 이곳에 자식클래스 a의 멤버함수 및 데이터멤버를 정의합니다.
} [/code]
클래스 a를 이용하여 객체를 생성한다면 객체를 생성할 때 생성자 체인에 의해 c, b, a 생성자가 순서대로 실행되며, 현 문서가 종료되는 시점에서 소멸자 체인에 의해 _a, _b, _c 소멸자가 순서대로 실행됩니다.
소멸자는 문서가 종료되는 시점에서 수행되기 때문에 현 문서가 출력되는 페이지에서는 그 실행여부를 확인할 수 없습니다. 만약 소멸자의 실행여부를 확인하려면 소멸자 실행 내용을 파일 등에 기록한 후 다음 페이지에서 이 파일 내용을 확인하면 될 것입니다.
[code php;gutter:false] class a extends aInterclass {
function a() {
.... 생성자에서 처리할 내용을 이곳에 작성합니다.
}

function _a() {
if ($fp=@fopen("/tmp/destr.txt", "a+")) {
flock($fp, LOCK_EX);
fwrite($fp, "_a() 실행 \n");
flock($fp, LOCK_UN);
fclose($fp);
}
}
} [/code]

Posted by 방글24