[php] 매직함수
매직함수
__sleep, wakeup과 같이 ""로 시작하는 매직함수(magic function)는 PHP 클래스 내에서 특수한 목적으로 사용됩니다. 따라서 이 함수들이 가지고 있는 문서화된 매직 기능을 사용할 필요가 없다면 클래스 내에 이 함수들을 정의해서는 안됩니다.
매직함수의 종류
- __construct() : 생성자 (본 php 강좌의 생성자편을 참조 바랍니다.)
- __destruct()
- __call()
- __callStatic()
- __get()
- __set()
- __isset()
- __unset()
- __sleep()
- __wakeup()
- __serialize()
- __unserialize()
- __toString()
- __invoke()
- __set_state()
- __clone()
- __debugInfo().
__call, __callStatic()
이 매직함수는 접근할 수 없는 클래스내의 메소드를 호출할때 발생한다. 가령 메소드가 private로 정의되있거나 아예없는 경우가 이에 속한다.
__callStatic() 은 static으로 접근할때 처리되는 것만이 다를 뿐이다.
public function __call($name, $arguments)
{
//if function exists within this class call it
if (method_exists(self, $name))
{
$this->$name($arguments); // __call을 이렇게 사용할 경우 private 도 접근 가능하다.
}
else
{
//otherwise check if function exists in obj and call it
if (method_exists($this->obj, $name))
{
$this->obj->$name($arguments);
}
else
{
throw new \Exception('Undefined function call.');
}
}
}
__get() __set()
get, set은 데이타를 넣거가 가져올때 사용하는데 private 에 대한 데이타에도 접근가능하다.
위에 설명드린 __call, __callStatic() 과 함께 접근할 수 없는 property에도 접근 할 수 있으므로 유용하게 사용가능하다.
public __set(string $name, mixed $value): void
public __get(string $name): mixed
class foo {
private $bar;
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
}
$foo = new foo();
$foo->bar = 'test';
echo "[$foo->bar]";
__sleep
serialize 함수를 통해 객체를 직렬화할 때 해당 클래스에 매직 함수 __sleep가 정의되어 있는지 확인합니다. 만약 정의되어 있다면 객체를 직렬화하기 전에 __sleep 함수를 수행합니다. 이 함수는 직렬화하기 전에 객체 멤버에 대하여 조작해야 하는 작업, 또는 직렬화하기 전에 미리 수행해야 하는 작업(예를 들어 데이터베이스 연결 종료 등)을 수행할 수 있습니다. __sleep 함수는 직렬화할 객체의 모든 멤버변수의 이름을 변수에 담아 반환합니다.
__wakeup
unserialize 함수를 통해 문자열을 객체화할 때 해당 클래스에 매직 함수 __wakeup가 정의되어 있는지 확인합니다. 만약 정의되어 있다면 객체화하기 전에 __wakeup 함수를 수행합니다. 이 함수를 수행할 때 객체화하기 전에 객체를 상대로 수행해야하는 작업, 또는 객체화하기 전에 미리 수행해야 하는 작업(예를 들어 데이터베이스 연결 등)을 수행할 수 있습니다.
class Scott {
private $error;
private $svar = array();
public function __constructor() {
$this->svar['Hello'] = "World";
}
function __sleep() {
$this->svar['Hello'] = "Yawn";
// return list of instance-variables to be serialized
return array('error', 'svar');
}
function __wakeup() {
$this->svar['test'] = "I'm here!";
}
}
$x = new Scott();
$y = serialize($x); // __sleep()이 실행된 후 객체(클라스)를 직렬화(문자열화) 시킴
$z = unserialize($y); // 문자열을 객체화 한후 unserializ() 실행
print_r($z);
__serialize(), __unserialize()
__serialize(), 와 __unserialize() 도 __sleep , __wakeup 과 유사한 기능을 제공하며 둘다 정의 된 경우 __sleep , __wakeup 는 무시된다.