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() 函数

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.