>백엔드 개발 >PHP 튜토리얼 >[PHP 클래스 및 객체] 매직 메소드

[PHP 클래스 및 객체] 매직 메소드

不言
不言원래의
2018-04-14 15:50:481684검색

이 글에서 공유한 내용은 [php 클래스 및 객체] 매직 메소드에 대한 내용입니다. 필요한 친구들이 참고할 수 있습니다.

매직 메소드(Magic 메소드)

__construct()__destruct()__callStatic()__set()__isset()__unset()__wakeup()__invoke()__clone() __debugInfo()

__sleep() __wakeup()

public array __sleep ( void )void __wakeup ( void )

__sleep()은 커밋되지 않은 데이터를 제출하거나 유사한 정리 작업을 수행하는 데 사용됩니다. 예를 들어 매우 큰 개체가 있지만 모두 저장할 필요는 없습니다.

__wakeup()은 역직렬화 작업에 사용됩니다. 예를 들어 데이터베이스 연결을 다시 설정하거나 다른 초기화 작업을 수행합니다.

serialize()는 클래스에 __sleep()이라는 마법 메서드가 있는지 확인합니다. 존재하는 경우 이 메서드가 먼저 호출된 다음 직렬화 작업이 수행됩니다. 이 함수는 객체를 정리하고 직렬화해야 하는 객체의 모든 변수 이름이 포함된 배열을 반환하는 데 사용할 수 있습니다. 메서드가 아무것도 반환하지 않으면 NULL이 직렬화되고 E_NOTICE 수준 오류가 발생합니다.

unserialize()는 __wakeup() 메서드가 있는지 확인합니다. 존재하는 경우 __wakeup 메서드를 먼저 호출하여 개체에 필요한 리소스를 미리 준비합니다.


위 개념 설명

Serialize는 객체를 포함한 변수를 연속 바이트 데이터로 변환할 수 있습니다. 직렬화된 변수를 파일에 저장하거나 네트워크를 통해 전송할 수 있습니다. 그런 다음 원본 데이터로 복원합니다. 클래스의 객체를 역직렬화하기 전에 정의한 클래스를 사용하면 PHP는 해당 객체의 속성과 메서드를 성공적으로 저장할 수 있습니다. 때로는 역직렬화 직후에 객체를 실행해야 할 수도 있습니다. 이를 위해 PHP는 자동으로 __sleep을 찾습니다.

객체가 직렬화되면 PHP는 객체를 역직렬화한 후 __sleep 메소드를 호출합니다. 두 메소드 모두 매개변수를 포함하는 배열을 반환해야 합니다. PHP는 다른 속성의 값을 버립니다. __sleep 메소드가 없으면 PHP는 모든 속성을 저장합니다.

프로그램이 실행되기 전에 serialize() 함수가 먼저 확인합니다. 매직 메소드 __sleep이 있는지 여부. 존재하는 경우 __sleep() 메소드가 먼저 호출된 후 직렬화(serialization) 작업이 수행됩니다. 이 함수는 객체를 정리하고 객체의 모든 변수 이름이 포함된 배열을 반환하는 데 사용할 수 있습니다. 메서드가 아무것도 반환하지 않으면 NULL이 직렬화되어 E_NOTICE 오류가 발생합니다. 대조적으로, unserialize()는 __wakeup 메소드가 있는지 확인합니다. 존재하는 경우 __wakeup 메소드를 먼저 호출하여 객체 데이터를 미리 준비합니다.

__sleep 메소드는 커밋되지 않은 데이터를 제출하거나 유사한 작업을 수행하는 데 자주 사용됩니다. 동시에 이 기능은 저장할 필요가 없는 큰 개체가 있는 경우 매우 유용합니다. __wakeup은 데이터베이스 연결 재설정이나 기타 초기화 작업 수행과 같은 역직렬화 작업에 자주 사용됩니다.


__toString()

은 클래스가 문자열로 처리될 때 어떻게 응답해야 하는지에 사용됩니다. 예를 들어 echo $obj; 는 뭔가를 표시해야 합니다.
이 메서드는 문자열을 반환해야 합니다. 그렇지 않으면 E_RECOVERABLE_ERROR 수준의 치명적인 오류가 발생합니다. __toString() 메서드에서는 예외가 발생할 수 없습니다. 그렇게 하면 치명적인 오류가 발생합니다.

Example #2 简单示例<?php// Declare a simple classclass TestClass{
    public function __toString() {
        return &#39;类被当成字符串时tostring返回字符串&#39;;        // return intval(&#39;tostring返回值的内容不为字符串&#39;);//Recoverable fatal error: Method TestClass::__toString() must return a string value
    }
}$class = new TestClass();echo $class;//echo (string)$class; // 未定义 __toString()方法,并将对象转换为字符串,报错Recoverable fatal error: Object of class TestClass could not be converted to string?>

주의해야 할 점은
PHP 5.2.0 이전에는 __toString() 메서드가 echo 또는 print와 함께 직접 사용될 때만 효과가 있을 수 있다는 점입니다.
PHP 5.2.0 이후에는 모든 문자열 환경(예: printf()를 통해 %s 수정자를 사용)에서 사용할 수 있지만 문자열이 아닌 환경(예: %d 수정자 사용)에서는 사용할 수 없습니다.
PHP 5.2.0부터 __toString() 메서드를 정의하지 않은 객체를 문자열로 변환하면 E_RECOVERABLE_ERROR 수준 오류가 발생합니다.


__invoke()

mixed __invoke ([ $... ] )

함수를 호출하여 객체를 호출하려고 하면 __invoke() 메서드가 자동으로 호출됩니다. (PHP 5.3.0)

Example #3 使用 __invoke()<?phpclass CallableClass {
    function __invoke($x) {
        var_dump($x);    //int(5)
    }
}$obj = new CallableClass;$obj(5);
var_dump(is_callable($obj));   //bool(true)?>

__set_state()

관련 추천:

[php 클래스 및 객체] traversal

[php 클래스 및 객체] 익명 클래스

[php 클래스 객체 포함] 과부하

위 내용은 [PHP 클래스 및 객체] 매직 메소드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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