PHP魔术函数
一共16个,__autoload()在php7.2之后就被废弃
除了一些老项目,现在一般都不会使用PHP7.2之前的版本了吧,本人公司现在使用的是PHP7.3
魔术函数 | 说明 |
---|---|
__construct() | 实例化对象时被调用,当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。 |
__destruct() | 当删除一个对象或对象操作终止时被调用。 |
__call() | 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。 |
__get() | 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。 |
__set() | 设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。 |
__toString() | 打印一个对象的时被调用。如echo |
__clone() | 克隆对象时被调用。如: |
__sleep() | serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。 |
__wakeup() | unserialize时被调用,做些对象的初始化工作。 |
__isset() | 检测一个对象的属性是否存在时被调用。如:isset($c->name)。 |
__unset() | unset一个对象的属性时被调用。如:unset($c->name)。 |
__set_state() | 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。 |
__autoload() | 本特性已自 PHP 7.2.0 起废弃。强烈建议不要使用本特性。 实例化一个对象时,如果对应的类不存在,则该方法被调用。 |
__callStatic() | 对象调用某个静态方法,若方法存在,则直接调用;若不存在,则会去调用__callStatic函数。 |
__invoke() | 当尝试以调用函数的方式调用一个对象时,方法会被自动调用。 |
__debugInfo() | 转储对象以获取应显示的属性时, 此方法由var_dump(调用。如果未在对象上定义该方法,则将显示所有公共,受保护和私有属性 |
使用实例
class Index
{
public $sleep;
private $id;
private $prop;
public function __construct($id=null)
{
$this->sleep=1;
$this->prop=$id;
echo '构造函数';
}
public function __destruct()
{
echo '析构函数';
}
public function __call($name,$data)
{
echo $name.'不存在';
}
public function __get($name)
{
echo $name.'调用了__get';
}
public function __set($name,$value)
{
echo '对' . $name . "附值" . $value;
}
public function __toString()
{
return "打印 Test";
}
public function __clone()
{
echo '克隆对象时被调用';
}
public function __sleep()
{
return []; #设置序列化时返回的属性
// return array('sleep');
}
public function __wakeup()
{
$this->id=1;#设置反序列化时返回的属性
echo 'unserialize之前被调用';
}
public function __isset($name)
{
echo $name.'被判断是否有定义';
}
public function __unset($name)
{
echo 'unset一个对象的属性时';
}
public static function __set_state($data)
{
var_dump($data);
$obj = new Test();
$obj->aaa =1;
$obj->bbb = 2;
return $obj;
}
public static function __callStatic($name,$arguments)
{
echo var_dump($name,$arguments);
// 注意: $name 的值区分大小写
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
public function __invoke($x) {
var_dump($x,'__invoke');
}
public function __debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
}
$index = new Index();
echo 1; #直接输出常量,调用了 __construct()与__destruct();
echo '<hr>';
$index->aa(); #调用没有定义的方法,调用了 __construct()与__destruct()与__call();
echo '<hr>';
echo $index->a; #输出没有定义的属性,调用了 __construct()与__destruct()__get();
echo '<hr>';
echo $index->b = 1;#定义属性调,用了 __construct()与__destruct()__set();
echo '<hr>';
echo $index; #直接输出对象,调用了 __construct()与__destruct()__toString();
echo '<hr>';
//$a=clone $this; #克隆对象,调用了 __construct()与__destruct()__clone();
echo '<hr>';
echo $ser = serialize($this);#序列化对象,调用了 __construct()与__destruct()__sleep();
echo '<hr>';
var_dump(unserialize($ser));#反序列化对象,调用了 __construct()与__destruct()__wakeup();
echo '<hr>';
var_dump(isset($index->e));# 检测一个对象的属性是否存在,调用了 __construct()与__destruct()__isset();
echo '<hr>';
unset($index->e);# unset一个对象的属性时,不管这属性存不存在,调用了 __construct()与__destruct()__unset();
echo '<hr>';
$index->aaa = 1;
$index->bbb = 2;
eval('$b = ' . var_export($index, true) . ';');
var_dump($b);
#unset一个对象的属性时,不管这属性存不存在,调用了 __construct()与__destruct()__set_state();
Index::bbb(123, 123, 456); #调用没有定义的方法,调用了 __construct()与__destruct()与__callStatic();
$index(5); #以调用函数的方式调用一个对象时,调用了 __construct()与__destruct()与__invoke();
var_dump(new Index(55)); #调用__debugInfo失败。。。。
网友评论