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()
,在销毁对象时析构函数照样执行。例如:
<?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