PHP __get(),__set(),__isset()和__unset()

示例

每当您尝试从此类中检索某个字段时,如下所示:

$animal = new Animal();
$height = $animal->height;

PHP调用magic方法__get($name),在这种情况下$name等于"height"。像这样编写类字段:

$animal->height = 10;

将调用魔术方法__set($name, $value),$name等于"height"和$value等于10。

PHP还具有两个内置函数isset(),它们检查变量是否存在,而unset()则销毁一个变量。检查是否像这样设置了对象字段:

isset($animal->height);

将__isset($name)在该对象上调用该函数。销毁这样的变量:

unset($animal->height);

将__unset($name)在该对象上调用该函数。

通常,当您不在类上定义这些方法时,PHP只会检索存储在类中的字段。但是,您可以重写这些方法以创建可以像数组一样保存数据但可以像对象一样使用的类:

class Example {
    private $data = [];

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __get($name) {
        if (!array_key_exists($name, $this->data)) {
            return null;
        }

        return $this->data[$name];
    }

    public function __isset($name) {
        return isset($this->data[$name]);
    }

    public function __unset($name) {
        unset($this->data[$name]);
    }
}

$example = new Example();

// 将'a'存储在$data数组中,值为15
$example->a = 15;

// 从$data数组中检索数组键'a'
echo $example->a; // 版画15

// 尝试从数组中检索不存在的键将返回null
echo $example->b; // 什么都不打印

// 如果__isset('a')返回true,则调用__unset('a')
if (isset($example->a)) {
    unset($example->a));
}

empty() 功能和魔术方法

请注意,调用empty()类属性将被调用,__isset()因为PHP手册指出:

empty()从本质上讲,它等效于!isset($var)|| $var ==否