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