PHP魔法函数
方法名 | 调用条件 |
---|---|
__call | 调用不可访问或不存在的方法时被调用__call($name, $args) |
__callStaitc | 调用不可访问或不存在的静态方法被调用 |
__clone | 进行对象clone时被调用,用来调整对象的克隆行为 |
__construct | 构建对象的时候被调用 |
__destruct | 明确销毁对象或脚本结束时被调用; |
__debuginfo | 当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 |
__isset | 对不可访问或不存在的属性,调用isset()或empty()时被调用 |
__unset | 对不可访问或不存在的属性,进行unset时被调用 |
__set | 当给不可访问或不存在的属性,赋值时被调用 |
__set_state | 当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值作为var_export的返回值 |
__get | 读取不可访问或不存在的属性时被调用 |
__toString | 当一个对象被转换成字符串时被调用 |
__invoke | 当以函数方式调用对象时被调用 |
__sleep | 当使用serialize(序列化)时被调用,当你不需要保存对于对象的所有数据时很有用 |
__wakeup | 当使用unserialize(反序列化)时被调用,可用于做些对象的初始化操作 |
PHP魔法函数自动调用的情况
<?php
class Test{
public $name = '';
public $age = 0;
public $content = '';
public function test(){
echo "名字" . $this->name . "--年龄". $this->age . "<br>";
}
public function __construct(){
echo "正在触发__construct构造方法<br>";
$this->name= 'xiao';
$this->age= 18;
$this->content = '';
}
public function __call($name, $arguments){
echo "正在触发__call魔法方法<br>";
}
public static function __callStatic($name, $arguments){
return "正在触发__callStatic魔法方法<br>";
}
public function __destruct(){
echo "正在触发__destruct析构方法<br>";
}
public function __clone(){
echo "正在进行克隆,触发了__clone魔法方法<br>";
}
public function __debugInfo(){
echo "正在触发__debuginfo魔法方法<br>";
}
public function __isset($name){
echo "正在触发__isset魔法方法<br>";
}
public function __unset($name){
echo "正在触发__unset魔法方法<br>";
}
public function __set($name, $value){
echo "正在触发__set魔法方法<br>";
}
public function __set_state($properties){
$t1 = new Test();
$t1->content = $properties['content'];
return $t1;
}
public function __get($name){
echo "正在触发__get魔法方法<br>";
}
public function __toString(){
return"正在触发__toString魔法方法<br>";
}
public function __invoke(){
echo "正在触发__invoke魔法方法<br>";
}
public function __sleep(){
echo "正在触发__sleep魔法方法<br>";
return array();
}
public function __wakeup(){
echo "正在触发__wakeup魔法方法<br>";
}
}
$t = new Test(); // 触发__construct构造方法
$t->test(); // 触发__call魔法方法
echo $t::getage(); // 触发__callStatic魔法方法
$t2 = clone $t; // 触发__clone魔法方法
var_dump($t->name); // 触发__debuginfo魔法方法
isset($t->phone); // 触发__isset魔法方法
unset($t->phone); // 触发__unset魔法方法
$t->phone = '13812345678'; // 触发__set魔法方法
$t->content = '正在触发__set_state魔法方法';
var_export($t); // 触发__set_state魔法方法
$t->addr; // 触发__get魔法方法
echo $t; // 触发__toString魔法方法
$t(); // 触发__invoke魔法方法
serialize($t); // 触发__sleep魔法方法
unserialize('O:4:"Test":0:{}') // 触发__wakeup魔法方法
// unserialize和clone内置函数都会调用两次__destruct魔法方法,其他的都是一次
?>
示例效果:
这里会调用__construct和__call魔法方法,因为进行实例化导致自动调用了类下面的构造方法,而我们还调用test类下面的test方法但是这方法我们是没有定义的这就导致了触发了call模仿方法的条件,调用了一个不存在的方法就自动调用了call方法,然后代码运行完毕之后就自动触发了析构方法,destruct魔法方法。
class Test{
public $name = '';
public $age = 0;
public $content = '';
public function test(){
echo "名字" . $this->name . "--年龄". $this->age . "<br>";
}
public function __construct(){
echo "正在触发__construct构造方法<br>";
$this->name= 'xiao';
$this->age= 18;
$this->content = '';
}
public function __call($name, $arguments){
echo "正在触发__call魔法方法<br>";
}
public static function __callStatic($name, $arguments){
return "正在触发__callStatic魔法方法<br>";
}
public function __destruct(){
echo "正在触发__destruct析构方法<br>";
}
public function __clone(){
echo "正在进行克隆,触发了__clone魔法方法<br>";
}
public function __debugInfo(){
echo "正在触发__debuginfo魔法方法<br>";
}
public function __isset($name){
echo "正在触发__isset魔法方法<br>";
}
public function __unset($name){
echo "正在触发__unset魔法方法<br>";
}
public function __set($name, $value){
echo "正在触发__set魔法方法<br>";
}
public function __set_state($properties){
$t1 = new Test();
$t1->content = $properties['content'];
return $t1;
}
public function __get($name){
echo "正在触发__get魔法方法<br>";
}
public function __toString(){
return"正在触发__toString魔法方法<br>";
}
public function __invoke(){
echo "正在触发__invoke魔法方法<br>";
}
public function __sleep(){
echo "正在触发__sleep魔法方法<br>";
return array();
}
public function __wakeup(){
echo "正在触发__wakeup魔法方法<br>";
}
}
$t = new Test();
$t->test();