魔术方法(Magic Methods)
__construct() 构造方法,类实例化的时候执行
__destruct() 析构函数,某个对象所有引用都被删除或者当前对象显示销毁的时候执行
__call() 调用类中一个不存在的方法的时候执行
__callStatic() 调用不存在的静态方法时,执行
__get() 调用不在的数组时执行
__set() 设置对象中不存在的属性时执行
__isset() 判断一个对象属性是否存在时执行
__unset() 销毁一个对象属性时执行
__sleep() 序列化一个对象前执行
__wakeup() 反序列化一个对象前执行
__toString() 把对象当成字符串输出时执行,返回一个字符串
__invoke() 把对象以函数的形式调用的时候执行
__set_state() 5.1.0时启用,调用var_export函数前执行
__clone() 克隆一个的对象的时候调用
示例:
class Test {
function __call($function_name, $args)
{
echo "你所调用的方法:$function_name(参数:<br />";
var_dump($args);
echo ")不存在!";
}
function __callstatic($function_name, $args)
{
echo "你所调用的静态方法:$function_name(参数:<br />";
var_dump($args);
echo ")不存在!";
}
}
$obj = new Test();
$obj->test();
$obj::test();
示例:
注意:经过测试,两个方法不能同时存在,只能有一个被运行(php7下测试运行)
class Test {
function __sleep()
{
echo '执行了serialize()函数';
}
function __wakeup()
{
echo '执行了unserialize()函数';
}
}
$obj = new Test();
$serializeObj = serialize($obj);
$unserializeObj = unserialize($serializeObj);
示例:
class Test {
function __invoke()
{
echo '把对象当成函数调用了';
}
}
$obj = new Test();
$obj();
示例:
<?php
class Test {
function __toString()
{
return '把对象当成字符串了';
}
}
$obj = new Test();
echo $obj;
实例
class Test{
public $a;
static function __set_state($array) {//必须是静态方法,参数是一个数组
echo '调用了var_export函数';
$tmp = new Test();
$tmp->a = 'abc';//直接赋值
return $tmp;//必须返回一个对象,可以是其他类的对象
}
}
$test = new Test();
eval('$b = '.var_export($test,true).';');
var_dump($b);
资料
Last updated
Was this helpful?