Недавно я недавно поговорил с другим разработчиком о взаимоотношениях между методами PHPи __get()
. Это было вызвано классом, который у нас есть, который ленивы нагружает другие объекты с помощью метода __get()
(lazy-load означает, что свойство не существует до первого доступа, после чего объект создается и возвращается). У нас были разные мнения о том, что __isset()
должен вернуться для свойства, которое еще не загружено. Свойство технически не существует (это не набор, или, по крайней мере, он установлен, но в настоящее время NULL
), но вызов ему также будет технически успешным (запрет любых исключений) и возвращает значение не NULL
,PHP: Отношения между __isset() и __get()
Итак, мой вопрос, в этой ситуации должна __isset()
просто быть индикатором того, будет ли или не __get()
успеха для того же аргумента (возвращение TRUE
если __get()
удастся и вернуть не- NULL
значение). Или, если он ведет себя более технически и возвращает FALSE
, так как данных еще не существует (хотя он будет при первом доступе)?
Простой пример:
class Foo {
protected $data;
public function __get($prop) {
if ($prop == 'bar') {
$this->data['bar'] = new Bar;
return $this->data['bar'];
}
}
public function __isset($prop) {
if ($prop == 'bar') {
// What goes here?
// return isset($this->data[$prop]) would mean
// that the first call to isset($foo->bar) below will be FALSE
// which means that using logic like this would always fail
// and __get() would never be called:
// isset($foo->bar) ? $foo->bar->baz : 'foo->bar not set'
}
}
}
class Bar {}
$foo = new Foo;
var_dump(isset($foo->bar)); // ???
$bar = $foo->bar;
var_dump(isset($foo->bar)); // bool(true)
'__isset' должен проверить значение, возвращаемое' __get', чтобы узнать, установлено ли оно – zzzzBov