생성자(Constructor) 및 소멸자(Destructor) 체인
일반적인 객체지향언어에서 보면 클래스 객체를 생성할 때마다 생성자가 실행되는데 객체를 생성할 때에 먼저 부모클래스의 생성자를 호출한 후 자식클래스의 생성자를 호출합니다.
그러나 PHP3 또는 PHP4 스크립트에서는 마지막으로 파생된 클래스의 생성자만을 호출하고 그 이상의 부모클래스의 생성자는 실행하지 않고 종료합니다. PHP에서의 생성자 동작 원리는 좀 더 복잡합니다. 자세한 것은 메뉴 “핍클래스홈>>클래스 사용법>>생성자”를 참조하기 바랍니다.
따라서 클래스를 정의할 때는 연속된 생성자 실행(생성자 체인)을 위해 반드시 생성자를 정의하고 그 생성자 내에서 부모클래스에 대한 생성자를 호출할 필요가 있습니다.
반면 클래스 객체가 파괴될 때마다 클래스 소멸자가 실행되는데 프로그램은 먼저 자식클래스의 소멸자를 호출한 후 부모클래스의 소멸자를 호출합니다.
“후키라이브러리”를 이용하여 클래스를 정의하면 생성자 및 소멸자 체인을 자동으로 구현할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/** * 파일명 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의 멤버함수 및 데이터멤버를 정의합니다. } |
클래스 a를 이용하여 객체를 생성한다면 객체를 생성할 때 생성자 체인에 의해 c, b, a 생성자가 순서대로 실행되며, 현 문서가 종료되는 시점에서 소멸자 체인에 의해 _a, _b, _c 소멸자가 순서대로 실행됩니다.
소멸자는 문서가 종료되는 시점에서 수행되기 때문에 현 문서가 출력되는 페이지에서는 그 실행여부를 확인할 수 없습니다. 만약 소멸자의 실행여부를 확인하려면 소멸자 실행 내용을 파일 등에 기록한 후 다음 페이지에서 이 파일 내용을 확인하면 될 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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); } } } |