PHP 매직메소스

PHP/매뉴얼 번역 2008/06/20 00:41
매직메소스

함수명 __construct, __destruct (컨스트럭터와 디스트럭터참조),  __call , __callStatic , __get, __set, __isset, __unset (오버로드참조), __sleep, __wakeup, __toString, __set_state 및 __clone  은 PHP 클래스 관련 특수함수이름이다. 이 함수들에 관련된 특별한 기능을 사용할 경우를 제외 하고 클래스 내에 이러한 이름의 함수를 작성할 수 없다.

警告

PHP 는 __ 로 시작하는 함수명을 특수함수로서 예약하고 있다. 문서화된 특수기능을 필요로 하는 경우를 제외하고 __로 시작하는 함수명을 사용하지말것을 권장한다.

__sleep  __wakeup

serialize() 는 클래스에 특수한 이름  __sleep 함수가 있는지 없는지를 조사한다. 만약 있으면 시리얼화하기 전에 해당 함수를 실행한다. 이 함수는 오브젝트를 클리어할 수 있다. 또한 시리얼화하는 오브젝트의 모든 변수명을 배열로 해서 리턴하는것을 전제로 하고 있다.  이 메소드가 아무것도 리턴하지 않는 경우는 NULL 이 시리얼화되어 E_NOTICE 가 발생한다. 

전형적인 __sleep 의 사용법은 도중에 데이터를 커밋하거나 비슷한 태스크의 클린업을 하는것들이다. 또한 오브젝트 크기가 꽤 크고 완전하게 보존할 필요가 없을경우 이 함수를 사용하면 유용하다. 

unserialize() 는 특수한 이름 __wakeup 을 가진 함수가 존재하는지 조사한다. 만약 존재할 경우 오브젝트가 가지고 있는 모든 리소스를 재구축할 수 있다. 

전형적인  __wakeup 의 사용법은 시리얼화할때 소실된 데이터베이스 컨넥션을 다시 행하거나 그 밖에 재초기화를 행한다.


Sleep 과 wakeup

<?php
class Connection
{
    protected
$link
;
    private
$server, $username, $password, $db
;
   
    public function
__construct($server, $username, $password, $db
)
    {
       
$this->server = $server
;
       
$this->username = $username
;
       
$this->password = $password
;
       
$this->db = $db
;
       
$this->connect
();
    }
   
    private function
connect
()
    {
       
$this->link = mysql_connect($this->server, $this->username, $this->password
);
       
mysql_select_db($this->db, $this->link
);
    }
   
    public function
__sleep
()
    {
        return array(
'server', 'username', 'password', 'db'
);
    }
   
    public function
__wakeup
()
    {
       
$this->connect
();
    }
}
?>

_toString
__toString 메소드를 사용하여 클래스가 문자열로 변환될때의 동작을 결정할 수 있다.

<?php
// Declare a simple class
class
TestClass
{
    public
$foo
;

    public function
__construct($foo
) {
       
$this->foo = $foo
;
    }

    public function
__toString
() {
        return
$this->foo
;
    }
}

$class = new TestClass('Hello'
);
echo
$class
;
?>

출력결과

Hello

주의해야 할것은 PHP 5.2.0 이전에서는 __toString 메소드는 echo() 또는 print() 와 직접결합된 경우에는 호출되었다.
PHP 5.2.0 이후부터는 모든 문자열 컨텍스트(예를 들어 printf()%s 수식자)에서 호출된다. 그러나 그 이외의 타입의 컨텍스트 (예를 들어 %d 수식자)에서는 호출되지 않는다. PHP 5.2.0 이후에서는 __toString 메소드를 가지고 있지 않는 오브젝트를 문자열로 변환하려고 하면 E_RECOVERABLE_ERROR 가 발생한다.

__set_state

static 메소드는 PHP 5.1.0 이후부터 var_export() 에 의해 익스포트된 클래스를 위해 호출된다. 

이 메소드의 유일한 패러미터는  익스포트된 프로퍼티를 array('property' => value, ...) 의 형식을 가지고 있는 배열이다.


__set_state 의 사용법 예PHP 5.1.0 이후)

<?php

class A
{
    public
$var1;
    public
$var2;

    public static function
__set_state($an_array) // As of PHP 5.1.0
   
{
       
$obj = new A;
       
$obj->var1 = $an_array['var1'];
       
$obj->var2 = $an_array['var2'];
        return
$obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval(
'$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);

?>

출력 결과

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}


원문링크: http://www.php.net/manual/en/language.oop5.magic.php

목차에
PHP 클래스와 오브젝트 ( Classes and Objects ) PHP 5



 

'PHP > 매뉴얼 번역' 카테고리의 다른 글

PHP Late Static Bindings  (0) 2008/06/20
PHP 타이프 힌팅  (0) 2008/06/20
PHP 오브젝트의 비교  (0) 2008/06/20
PHP 오브젝트의 클론 생성  (0) 2008/06/20
PHP final 키워드  (0) 2008/06/20
PHP 매직메소스  (0) 2008/06/20
PHP 패턴  (0) 2008/06/20
PHP 오브젝트 이터레이션  (0) 2008/06/20
PHP 오버로드  (0) 2008/06/20
PHP 오브젝트 인터페이스  (0) 2008/06/20
PHP 클래스의 추상화  (0) 2008/06/19
Trackback 0 : Comment 0