奇怪的PHP魔术吸气剂在阵列上

时间:2016-01-27 08:49:02

标签: php

我有魔术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存在,不应该吗?

2 个答案:

答案 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()方法。