__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() , __set_state() 및 __clone()은 PHP에서 "매직 메서드"라고 합니다. 매직 기능을 사용하려는 경우가 아니면 자체 클래스 메서드 이름을 지정할 때 이러한 메서드 이름을 사용할 수 없습니다.
PHP는 __(밑줄 2개)로 시작하는 모든 클래스 메소드를 매직 메소드로 예약합니다. 따라서 클래스 메소드를 정의할 때 위의 매직 메소드를 제외하고 앞에 __를 붙이지 않는 것이 좋습니다.
__sleep() 및 __wakeup()
publicarray__sleep( void )
void__wakeup( void )
serialize( ) 함수는 클래스를 확인합니다. __sleep()이라는 마법 메서드가 있나요? 존재하는 경우 이 메서드가 먼저 호출된 다음 직렬화 작업이 수행됩니다. 이 함수는 객체를 정리하고 직렬화해야 하는 객체의 모든 변수 이름이 포함된 배열을 반환하는 데 사용할 수 있습니다. 메서드가 아무것도 반환하지 않으면 NULL이 직렬화되고 E_NOTICE 수준 오류가 생성됩니다.
참고:
__sleep()은 상위 클래스의 전용 멤버 이름을 반환할 수 없습니다. 그렇게 하면 E_NOTICE 수준 오류가 발생합니다. 대신 직렬화 가능 인터페이스를 사용할 수 있습니다.
__sleep() 메서드는 커밋되지 않은 데이터를 제출하거나 유사한 정리 작업을 수행하는 데 자주 사용됩니다. 동시에 이 기능은 큰 개체가 있지만 모두 저장할 필요가 없는 경우에 유용합니다.
반대로 unserialize()는 __wakeup() 메서드가 있는지 확인합니다. 존재하는 경우 __wakeup 메서드를 먼저 호출하여 개체에 필요한 리소스를 미리 준비합니다.
__wakeup()은 데이터베이스 연결 재설정이나 기타 초기화 작업 수행과 같은 역직렬화 작업에 자주 사용됩니다.
예제 1 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(void)
__toString() 메서드는 class 문자열로 처리될 때 응답하는 방법입니다. 예를 들어 echo $obj; 는 뭔가를 표시해야 합니다. 이 메서드는 문자열을 반환해야 합니다. 그렇지 않으면 E_RECOVERABLE_ERROR 수준의 치명적인 오류가 발생합니다.
__toString() 메서드에서는 예외를 발생시킬 수 없습니다. 그렇게 하면 치명적인 오류가 발생합니다.
예제 #2 간단한 예
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() 메서드가 직접적으로만 사용됩니다. 에코나 인쇄와 함께 사용할 때만 적용됩니다. PHP 5.2.0 이후에는 모든 문자열 환경(예: %s 수정자를 사용하여 printf()를 통해)에서 사용할 수 있지만 문자열이 아닌 환경(예: %d 수정자 사용)에서는 사용할 수 없습니다. PHP 5.2.0부터 __toString() 메서드를 정의하지 않은 객체를 문자열로 변환하면 E_RECOVERABLE_ERROR 수준 오류가 발생합니다.
__invoke()
mixed__invoke ([ $... ] )
함수를 호출하여 객체를 호출하려고 하면 __invoke() 메서드는 자동으로 호출됩니다.
참고:
이 기능은 PHP 5.3.0 이상에서만 사용할 수 있습니다.
예제 #3 __invoke()
class CallableClass { function __invoke($x){ var_dump($x); } } $obj = new CallableClass; $obj(5); var_dump(is_callable($obj));
를 사용하여 결과를 출력합니다.
int(5)
bool(true)
__set_state()
정적 객체 __set_state (배열 $properties)
PHP 5.1.0부터 클래스를 내보내기 위해 var_export()를 호출할 때 이 정적 메서드가 호출됩니다.
이 메소드의 유일한 매개변수는 array('property' => value, ...) 형식으로 정렬된 클래스 속성을 포함하는 배열입니다.
예제 #4 __set_state()> 사용(PHP 5.1.0부터)
class A { public $var1; public $var2; public static function __set_state($an_array) { $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).';'); var_dump($b);
출력 결과:
object(A)#2 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo" }