본문 바로가기
프로그래밍/PHP

PHP 컨스트럭터와 디스트럭터

by 백룡화검 2010. 3. 17.
컨스트럭터와 디스트럭터 (Constructors and Destructors)

Constructor
void __construct ([ mixed $args [, $... ]] )

PHP 5 에서는 개발자가 클래스의 컨스트럭터 메소드를 선언할 수 있다.  컨스트럭터메소드를 가진 클래스는 새로운 오브젝트가 생성될때마다 이 메소드를 호출한다. 이 호출에 의해서 오브젝트를 사용하기전에 필요한 초기화를  행할 수 있다.

주의: 자식 클래스가 컨스트럭터를 가지고 있는 경우 부모클래스의 컨스트럭터가 암묵적으로 호출되지 않는다. 부모클래스의 컨스트럭터를 실행하기위해서는 자식 클래스내에서 parent::__construct() 를 호출하여야 한다.

새롭게 통합된 컨스트럭터 사용 예

<?php
class BaseClass
{
   function
__construct
() {
       print
"In BaseClass constructor\n"
;
   }
}

class
SubClass extends BaseClass
{
   function
__construct
() {
       
parent::__construct
();
       print
"In SubClass constructor\n"
;
   }
}

$obj = new BaseClass
();
$obj = new SubClass
();
?>

하위 호환성을 유지하기 위하여 PHP 5 가 주어진 클래스에서 __construct() 함수를 찾을 수 없는 경우 구형식의 컨스트럭터 함수 , 즉 클래스 이름과 똑같은 함수를 찾게된다. 실제로 호환성의 문제가 발생할 가능성이 있는것은  주어진 클래스가  __construct() 라는 이름의 메소드를 가지고 있으며 다른 용도로 사용되고 있는 경우이다.
 
Constructor

void __destruct ( void )

PHP 5 에서는 C++ 같은 다른 오브젝트지향언어와 닮은 개념의 디스트럭터가 도입되었다. 디스트럭터메소드는 특정 오브젝트에의 모든 참조(레퍼런스)가 삭제된 직후 도는 오브젝트가 명시적으로 파기된 직후 호출된다. 또는 스크립트의 종료시에도 무작위로 호출된다. 

디스트럭터 예
<?php
class MyDestructableClass
{
   function
__construct
() {
       print
"In constructor\n"
;
       
$this->name = "MyDestructableClass"
;
   }

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

$obj = new MyDestructableClass
();
?>

컨스트럭터와 마찬가지로 부모클래스의 디스트럭터가 엔진에 의해 암묵적으로 호출되지 않는다. 부모클래스의 디스트럭터를 실행하기위해서는 디스트럭터내에서  명시적으로 parent::__destruct() 를 호출하여야 한다.

주의: 스크립트의 셧다운시 디스트럭터가 호출되는 경우 HTTP 헤더는 이미 송신되어 있다. 스크립트의 셧다운시의 작업디렉토리는 SAPI (예를 들어 아파치)에 따라 다르다.

주의: 디스트럭터의 내부에서 (스크립트의 종료처리시에) 예외를 던지려고 하면 치명적인 에러를 일으킨다.
원문링크: http://www.php.net/manual/en/language.oop5.decon.php

출처 : http://breakpoint.tistory.com/107