이 글은 PHP에서 흔히 사용되는 매직 메소드를 자세하게 정리, 요약하고 참고할 수 있도록 공유합니다
1. PHP는 "__"로 시작하는 모든 메소드를 매직 메소드로 처리하므로 사용자 정의 메소드는 "__"로 시작할 수 없습니다.
PHP에서 제공하는 오버로딩은 속성이나 메소드를 동적으로 생성하는 것을 의미합니다. 오버로딩은 마법의 방법을 통해 달성됩니다. 이러한 매직 메서드의 매개 변수는 전달할 수 없습니다. __get(), __set(), __isset(), __unset()은 클래스 속성 오버로드를 구현합니다.
2. 클래스에서 액세스할 수 없는 속성에 액세스할 때 __get() 메서드가 호출됩니다.
3. 클래스에서 액세스할 수 없는 속성에 액세스할 때 상황에 따라 __get(), __set(), __isset(), __unset()이 호출됩니다. 속성에 액세스할 때는 isset() 또는 empty() 함수를 사용합니다. unset() 함수를 사용하면 __isset() 메서드가 호출됩니다.
4. 이 네 가지 메소드는 static 키워드를 사용하여 정의할 수 없습니다. php5.3.0 이후에는 이 네 가지 메소드를 정의하기 위해 정적 메소드를 사용하는 경우 경고 수준 경고가 발생합니다.
5. 액세스할 수 없는 속성이란 무엇입니까? (1) 클래스에 없는 속성, (2) 클래스 외부에서 프라이빗 변수에 액세스합니다. 메서드 오버로드는 __call()과 __callstatic()을 통해 구현됩니다. 둘 사이의 차이점은 컨텍스트가 정적 메서드인지 여부입니다. 후자는 액세스할 수 없는 정적 메서드가 호출될 때 호출됩니다. __callstatic()이 php5.3.0에 추가되었습니다.
6. __sleep() 및 __wakeup()
serialize()가 직렬화되면 먼저 __sleep() 함수가 있는지 확인합니다. 함수가 있으면 먼저 __sleep()을 호출하고 모든 변수 이름이 포함된 배열을 반환합니다. 직렬화되고 알림 수준 오류가 발생합니다.
__wakeup() 메서드는 __sleep()과 반대이며 unserialize()가 호출될 때 호출됩니다
7. __toString(), 이를 문자열로 변환하는 방법을 클래스에서 결정하도록 합니다. php5.2.0 이전에는 이 메서드가 echo 또는 print 메서드와 결합되어야만 효과적이었습니다. php5.2.0 이후에는 printf(와 결합할 수 있습니다. ) 수정이 가능하지만 수정 시 %d 등의 비문자 수식자는 사용할 수 없습니다.
8. __invoke(), 함수를 호출하여 객체를 호출하려고 하면 이 함수가 트리거됩니다. php5.3 이후에만 적용됩니다.
9. __set_state() 정적 메서드. 이 정적 메서드는 var_export()가 호출될 때만 호출됩니다. php5.1.0 이후에 적용됩니다. 유일한 매개변수는 배열을 받는 것입니다.
10. __construct() 및 __destruct(), 생성자와 소멸자 생성자는 주로 클래스 초기화에 사용됩니다. 객체에 대한 모든 참조가 삭제된 후 또는 객체가 명시적으로 소멸될 때 소멸자는 실행됩니다. 소멸자에서는 예외가 발생하는 것이 허용되지 않습니다. 그렇지 않으면 모든 http 헤더가 전송되면 스크립트 끝에서 소멸자가 호출됩니다.
11. __clone(), 객체 복사, 이 메서드는 직접 호출할 수 없으며, clone 키워드를 통해 명시적으로 호출해야 합니다
//实例化对象时,会调用对象的__construct方法 $obj = new Object(); //给对象不存在的属性赋值时,会调用对象的__set方法 $obj->title = "hello"; //使用对象不存在的属性时,会调用对象的__get方法 echo $obj->title; //调用对象不存在的方法时,会调用对象的__call方法 $obj->test("hello",123,567); //调用不存在的类静态方法时,会调用类的__callStatic方法 Object::staticMethod("static","not found method"); //直接输出对象时,会调用对象的__toString方法 echo $obj; //将一个对象当作函数一样使用时,会调用对象的__invoke方法 echo $obj("test"); //克隆对象时,会调用对象的__clone方法 $obj2 = clone $obj; //判断对象属性是否存在时,会调用对象的__isset方法 var_dump(isset($obj->aaa)); //销毁对象属性时,会调用对象的__unset方法 unset($obj->aaa); class Object{ protected $array = array(); function __construct() { echo __METHOD__."你正在实例化对象<br>"; } function __set($name, $value) { $this->array[$name]=$value; } function __get($name) { return $this->array[$name]; } function __call($name, $arguments) { var_dump($name,$arguments); return "magic function\n"; } static function __callStatic($name, $arguments) { var_dump($name,$arguments); return "magic static function"; } function __toString() { return __CLASS__.'<br>'; } function __invoke($arguments) { var_dump($arguments); return __METHOD__.'<br>'; } function __clone() { echo __METHOD__."你正在克隆对象<br>"; } function __isset($name) { echo __METHOD__."你想判断有没有属性".$name."<br>"; return 1; } function __unset($name) { echo __METHOD__."你想删除属性".$name."<br>"; } function __destruct() { echo __METHOD__."你正在注销对象<br>"; } }