update : 2015.11.03
php.shukuma.com

검색:
 
 
특수 메서드

특수 메서드

다음 함수들은 __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() and __debugInfo() PHP 클래스에서는 특별합니다. 이 함수들과 관련된 특별한 사용외에 클래스에서는 해당 함수명을 사용하지 않아야 합니다.

Caution

PHP에서는 모든 특수함수명이 __ 로 시작합니다. 문서화된 특수기능을 위한게 아니라면 함수명을 __ 로 시작하지 않을것을 권장합니다.

__sleep() and __wakeup()

public array __sleep ( void )
void __wakeup ( void )

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()

public string __toString ( void )

__toString() 메서드는 클래스가 문자열로 변환될때의 동작을 결정하도록 해줍니다. 예를 들면, echo $obj; 가 출력할 결과를 보면 됩니다. 메서드는 문자열을 리턴해야 합니다. 그렇지 않을경우 E_RECOVERABLE_ERROR 레벨의 에러가 발생합니다.

Warning

__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() 메서드가 오직 echoprint 에만 연결되어 있다는 것입니다. PHP 5.2.0 이후로는, 어떤 문자열 컨텍스트라도 호출할 수 있습니다(예를 들면 printf()%s 와 같은) 그러나 다른 타입의 컨텍스트에는 호출되지 않습니다. (예를 들어 %d 와 같은). PHP 5.2.0 이후로는, __toString()이 없는 객체의 문자열로의 변환은 E_RECOVERABLE_ERROR 를 발생할 것입니다.

__invoke()

mixed __invoke ([ $... ] )

__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)

__set_state()

static object __set_state ( array $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($atrue) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);

?>

위 예제의 출력:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

__debugInfo()

array __debugInfo ( void )

이 메서드는 var_dump()에 의해 덤프될때 보여줄 속성을 가져올때 호출됩니다. 만약에 객체에 해당 메서드가 정의되어 있지 않을경우, 모든 public, protected, private 속성을 보여주게 됩니다.

이 기능은 PHP 5.6.0 에서 추가되었습니다.

Example #5 Using __debugInfo()

<?php
class {
    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)
}