PHP类有哪些魔术方法,各有什么用途?

答案

  • __construct():构造函数,每次new创建新对象时先调用此方法。

  • __destruct():析构函数,对象的所有引用都被删除,或者当对象被显式销毁时执行。

  • __call():在对象中调用一个不可访问方法时,__call() 会被调用。

  • __callStatic():在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

  • __get():读取不可访问属性的值时,__get() 会被调用。

  • __set():在给不可访问属性赋值时,__set() 会被调用。

  • __isset():当对不可访问属性调用 isset()empty() 时,__isset() 会被调用。

  • __unset():当对不可访问属性调用 unset() 时,__unset() 会被调用。

  • __sleep()serialize() 序列化对象时先调用该方法,用于保存对象属性值。

  • __wakeup()unserialize() 反序列化对象时先调用该方法,用于准备对象需要的资源。

  • __toString():用于一个类被当成字符串时应怎样回应。例如 echo $obj;

  • __invoke():当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

  • __set_state():调用 var_export() 导出类时,此静态方法会被调用。

  • __clone():使用 clone 复制对象在完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

  • __debugInfo()var_dump()对象时调用。

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。

答案解析

注意,即使类方法中包含exit(),在销毁对象时析构函数照样执行。例如:

  1. <?php
  2. class Test
  3. {
  4. public function get()
  5. {
  6. echo "123\n";
  7. exit();
  8. echo "456";
  9. }
  10. public function __destruct()
  11. {
  12. echo "destroy object";
  13. }
  14. }
  15. $a = new Test;
  16. $a->get();

这段代码的输出是:

  1. 123
  2. destroy object