[php] 매직함수 updated_at: 2024-12-15 04:02

매직함수

__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 는 무시된다.

평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글