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

271 5月之前 PHP 面向对象

答案

  1. __construct():构造函数,每次new创建新对象时先调用此方法。
  2. __destruct():析构函数,对象的所有引用都被删除,或者当对象被显式销毁时执行。
  3. __call():在对象中调用一个不可访问方法时,__call() 会被调用。
  4. __callStatic():在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
  5. __get():读取不可访问属性的值时,__get() 会被调用。
  6. __set():在给不可访问属性赋值时,__set() 会被调用。
  7. __isset():当对不可访问属性调用 isset()empty() 时,__isset() 会被调用。
  8. __unset():当对不可访问属性调用 unset() 时,__unset() 会被调用。
  9. __sleep()serialize() 序列化对象时先调用该方法,用于保存对象属性值。
  10. __wakeup()unserialize() 反序列化对象时先调用该方法,用于准备对象需要的资源。
  11. __toString():用于一个类被当成字符串时应怎样回应。例如 echo $obj;
  12. __invoke():当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
  13. __set_state():调用 var_export() 导出类时,此静态方法会被调用。
  14. __clone():使用 clone 复制对象在完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。
  15. __debugInfo()var_dump()对象时调用。

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

答案解析

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

<?php

class Test
{
    public function get()
    {
        echo "123\n";
        exit();
        echo "456";
    }

    public function __destruct()
    {
        echo "destroy object";
    }
}

$a = new Test;
$a->get();

这段代码的输出是:

123
destroy object