PHP 魔术方法 - __unset()
如果我们要销毁一个变量,通常有两种方法,一个是使用 unset()
,另一个是直接赋值为 NULL
。对于普通的变量,几乎可以把两者画上等号。但对于实例的属性,那么结果也是一样,但过程是不一样的。
首先,要说明的是,使用 unset()
一个实例不存在的属性并不会报错,但 unset()
一个私有的或不可见的属性,仍然会报错,例如下面的代码
<?php class Person { private $name; public function __construct($name = '' ) { $this->name = $name; } } $person = new Person('Yufei'); unset($person->age); unset($person->name);
输出结果如下
[yufei@localhost php]$ php demo.php Fatal error: Uncaught Error: Cannot access private property Person::$name in /Users/yufei/php/demo.php:16 Stack trace: #0 {main} thrown in /Users/yufei/php/demo.php on line 16
可以看到 unset($person->name)
并没有报错,反而是 unset($person->name)
报错了。
为了解决这个问题,也为了能在 unset 一个不存在的属性时有个提示,我们可以为类定义 __unset()
魔术方法
__unset()
魔术方法
如果一个类定义了魔术方法 __unset()
,那么我们就可以使用 unset()
函数来销毁类的私有的属性,或在销毁一个不存在的属性时得到通知。
实际上有没有销毁那个属性,取决于 __unset()
的具体实现,也就是,我们也可以定义一个空的实现
__unset()
魔术方法的原型如下
public function __unset( $property ) { // 一些销毁属性的方法,一般是调用 unset() }
范例
下面的范例,我们为类 Person
定义一个 __unset()
方法,然后再销毁它的实例的私有属性 $name
和不存在的属性 $age
<?php class Person { private $name; public function __construct($name = '' ) { $this->name = $name; } public function __unset( $property ) { echo "在实例外部调用 unset() 函数销毁实例的不可见属性或不存在的属性时会自动调用该方法\n"; echo "你正在销毁 {$property}\n"; unset($this->$property); } } $person = new Person('Yufei'); unset($person->age); unset($person->name);
输出结果如下
[yufei@localhost php]$ php demo.php 在实例外部调用 unset() 函数销毁实例的不可见属性或不存在的属性时会自动调用该方法 你正在销毁 age 在实例外部调用 unset() 函数销毁实例的不可见属性或不存在的属性时会自动调用该方法 你正在销毁 name
发现没有 ? 当我们销毁一个不存在的属性时,也会自动调用 __unset()
函数