我有魔术getter / isset的奇怪问题。 我有myObject定义了魔法getter / isset:
private $_data = array();
public function __get($name) {
if (array_key_exists($name, $this->_data)) return $this->_data[$name];
throw new Exception($name.': property doesn\'t exist.');
}
public function __isset($name) {
return isset($this->_data[$name]);
}
如果我打电话:
isset($myObject->notExisting);
empty($myObject->notExisting);
我有正确的行为(调用__isset()),而如果我调用:
isset($myObject->notExisting['ok']));
empty($myObject->notExisting['ok']));
当__get()为。时,不会调用__ isset()
这对我来说似乎很奇怪,因为PHP在尝试获取它之前应首先检查$ myObject-> notExisting存在,不应该吗?
答案 0 :(得分:3)
根据docs:
__ isset()是通过在不可访问的属性上调用isset()或empty()来触发的。
isset($myObject->notExisting);
中的 isset适用于notExisting
的{{1}}属性。
$myObject
中的 isset适用于isset($myObject->notExisting['ok']));
数组的ok
元素。
答案 1 :(得分:1)
这是正确的行为。
让我们对此进行调整:
isset($myObject->notExisting['ok']));
这意味着$ myObject-> notExisting存在,因为您希望使用键'ok'获取数组中的对象。所以这将使用__get()方法。