get() set() isset() 和 unset()

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

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

PHP 调用魔术方法 __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();

// Stores 'a' in the $data array with value 15
$example->a = 15;

// Retrieves array key 'a' from the $data array
echo $example->a; // prints 15

// Attempt to retrieve non-existent key from the array returns null
echo $example->b; // prints nothing

// If __isset('a') returns true, then call __unset('a')
if (isset($example->a)) {
    unset($example->a));
}

empty() 函数和魔术方法

请注意,调用 empty() 上一个类属性将调用 __isset() 因为 PHP 手册状态:

empty() 基本上是 !isset($ var)|| 的简洁等价物 $ var == false