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
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 메소드를 사용하여 클래스가 문자열로 변환될때의 동작을 결정할 수 있다.
예
// 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;
?>
출력결과
주의해야 할것은 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);
?>출력 결과
["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 |