>  기사  >  백엔드 개발  >  PHP 매직 메소드

PHP 매직 메소드

伊谢尔伦
伊谢尔伦원래의
2016-11-23 13:58:211449검색

__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" }


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:php--최종 키워드다음 기사:php--최종 키워드