다음 함수들은 __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() and __debugInfo() PHP 클래스에서는 특별합니다. 이 함수들과 관련된 특별한 사용외에 클래스에서는 해당 함수명을 사용하지 않아야 합니다.
PHP에서는 모든 특수함수명이 __ 로 시작합니다. 문서화된 특수기능을 위한게 아니라면 함수명을 __ 로 시작하지 않을것을 권장합니다.
serialize()는 클래스가 __sleep() 특수함수를 가지는지 확인합니다.
만약에 그렇다면, 직렬화 이전에 실행됩니다. 또한 객체에서 직렬화 가능한 모든 변수들의 배열을 반환할 수 있음을 전제로 객체를 제거할수 있습니다.
만약에 메서드가 다른 어떤것도 리턴하지 않으면, NULL
이 직렬화되고 E_NOTICE
를 발생합니다.
Note:
__sleep()에서 부모 클래스의 private 속성의 이름을 반환할 수 없습니다. 그렇게 하면
E_NOTICE
레벨 에러를 발생합니다. 대신에 Serializable 인터페이스를 사용할 수 있을것입니다.
__sleep() 의 의도된 사용은 데이터를 커밋하거나 비슷한 정리 작업을 수행하는 것입니다. 또한, 이 함수는 매우 큰 객체를 완전히 저장할 필요가 없을 경우에 유용합니다.
반대로, unserialize() 는 클래스가 __wakeup() 특수함수를 가지는지 확인합니다. 만약에 그렇다면, 원래의 객체가 가졌던 리소스들을 재건할수 있습니다.
__wakeup()의 의도된 사용은 직렬화 과정에서 끊어진 데이터베이스 커넥션을 재연결하고, 다른 재초기화 작업을 수행하는것입니다.
Example #1 Sleep 과 wakeup
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __sleep()
{
return array('dsn', 'username', 'password');
}
public function __wakeup()
{
$this->connect();
}
}?>
__toString() 메서드는 클래스가 문자열로 변환될때의 동작을 결정하도록 해줍니다.
예를 들면, echo $obj; 가 출력할 결과를 보면 됩니다. 메서드는 문자열을 리턴해야 합니다. 그렇지 않을경우
E_RECOVERABLE_ERROR
레벨의 에러가 발생합니다.
__toString() 메서드 내에서는 예외를 발생할 수 없습니다. 그럴경우에는 치명적인 에러가 발생합니다.
Example #2 간단한 예제
<?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
를 발생할 것입니다.
__invoke() 메서드는 스크립트가 객체를 함수로 호출했을때 호출합니다.
Note:
이 기능은 PHP 5.3.0 이후부터 존재합니다.
Example #3 Using __invoke()
<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
위 예제의 출력:
int(5) bool(true)
$properties
)static 메서드는 PHP 5.1.0 이후부터 var_export() 에 의해 내보내진 클래스를 위해 호출됩니다.
이 메서드의 유일한 파라미터는 내보내진 속성을 가진 특정형식(array('property' => value, ...))의 배열입니다.
Example #4 __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" }
이 메서드는 var_dump()에 의해 덤프될때 보여줄 속성을 가져올때 호출됩니다. 만약에 객체에 해당 메서드가 정의되어 있지 않을경우, 모든 public, protected, private 속성을 보여주게 됩니다.
이 기능은 PHP 5.6.0 에서 추가되었습니다.
Example #5 Using __debugInfo()
<?php
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>
위 예제의 출력:
object(C)#1 (1) { ["propSquared"]=> int(1764) }