Forum und email

생성자

Caution

PHP 3와 PHP 4에서 생성자(constructor)는 서로 다르게 동작한다. PHP 4의 문법이 강력히 추천하는 바이다.

생성자는 new를 사용하여 클래스의 새 인스턴스를 생성할때 자동으로 호출되는 클래스 내의 함수를 말한다. PHP 3에서는 클래스의 이름과 동일한 함수가 생성자가 된다. PHP 4에서는 클래스가 선언될때의 클래스명과 동일한 이름을 갖는 함수가 생성자가 된다. - 차이는 미묘하지만 매우 중요하다 (다음 글을 보세요).

<?php
// PHP 3와  PHP 4에서 작동함
class Auto_Cart extends Cart
{
    function 
Auto_Cart()
    {
        
$this->add_item ("10"1);
    }
}
?>

위 코드는 Cart와 같은 Auto_Cart 클래스를 선언하고 "new"로 새로운 Auto_Cart가 생성될때마다 상품번호 "10"인 아이템 하나를 갖는 카트로 초기화하는 생성자를 만든다. 생성자는 인자를 취할수 있고 이런 인자로 인해 생성자를 더 유용하게 만들어주지만 없을수도 있다. 인자가 없는 클래스를 사용하려면 생성자의 모든 인자는 기본값을 제공해 줄수 있다.

<?php
// PHP 3와 PHP 4에서 동작함.
class Constructor_Cart extends Cart
{
    function 
Constructor_Cart($item "10"$num 1)
    {
        
$this->add_item ($item$num);
    }
}
 
// Shop the same old boring stuff.
 
$default_cart = new Constructor_Cart;
 
// Shop for real...
 
$different_cart = new Constructor_Cart("20"17);
?>

생성자에서 발생할수 있는 에러 메시지를 보이지 않게 하려면 @연산자를 사용할수 있다.즉, @new를 쓸수 있다.

Caution

PHP 3에서 파생 클래스와 생성자는 많은 제약을 갖는다. 다음 예제 코드는 이런 제약을 이해하기 위해 주의깊게 살펴봐야할것이다.

<?php
class A
{
    function 
A()
    {
      echo 
"I am the constructor of A.<br>\n";
    }
}

class 
extends A
{
    function 
C()
    {
        echo 
"I am a regular function.<br>\n";
    }
}

// PHP 3에서는 어떤 생성자도 호출되지 않는다.
$b = new B;
?>

위 예제 코드는 PHP 3에서는 어떤 생성자도 호출되지 않는다. PHP 3의 규칙은 : '생성자는 클래스와 같은 이름을 갖는 함수이다'. 클래스명 이 B이고 이 클래스에서는 B()함수가 없으므로 아무일도 일어나지 않는다.

PHP 4에서는 다른 규칙이 적용되어서 이런 규칙의 문제가 해결되었다: 클래스가 생성자를 갖지 않을때, 원래 클래스에서 생성자가 존재하면 그 생성자가 호출된다. 위 예제 코드는 PHP 4에서 'I am the constructor of A.<br>' 를 출력할것이다.

<?php
class A
{
    function 
A()
    {
        echo 
"I am the constructor of A.<br>\n";
    }

    function 
B()
    {
        echo 
"I am a regular function named B in class A.<br>\n";
        echo 
"I am not a constructor in A.<br>\n";
    }
}

class 
extends A
{
    function 
C()
    {
        echo 
"I am a regular function.<br>\n";
    }
}

// This will call B() as a constructor.
$b = new B;
?>

PHP 3에서 클래스 A의 함수 B()는 의도하지 않았을지라도 즉시 클래스 B의 생성자가 될것이다. PHP 3의 규칙: '생성자는 클래스와 같은 이름을 갖는 함수이다'. PHP 3에서는 그 함수가 클래스 B에서 선언되었는지 또는 거기서 상속되었는지는 상관하지 않는다.

위 규칙의 문제점을 PHP 4에서는 다음과 같은 규칙으로 해결했다 : '생성자는 그것이 선언된 클래스와 같은 이름을 갖는 함수이다'. 따라서 PHP 4는 클래스 B가 생성자를 갖지 않으므로 원래 클래스의 생성자가 호출되어서 'I am the constructor of A.<br>'를 출력한다.

Caution

PHP 3와 PHP 4 모두 파생 클래스의 생성자에서 자동으로 원래 클래스의 생성자를 호출하지 않는다. 적절하게 상단에 생성자 호출을 전달할 책임은 당신에게 달려있다.

Note: PHP 3나 PHP 4에서는 소멸자(destructor)를 지원하지 않는다. 대신에 이런 소멸자의 기능을 수행하기 위해 register_shutdown_function() 함수를 사용할수 있다.

소멸자는 객체가 파괴될때, unset()함수나, 단순히 현재 영역을 벗어남으로써 자동으로 호출되는 함수이다. PHP에서는 소멸자가 없다.