У меня очень странная и неожиданная проблема.
empty()
возвращает TRUE
для непустого свойства по неизвестной мне причине.
class MyObject { private $_property; public function __construct($property) { $this->_property = $property; } public function __get($name) { $priv_name = "_{$name}"; if (isset($this->$priv_name)) { return $this->$priv_name; } else { return NULL; } } } $obj = new MyObject('string value'); echo $obj->property; // Output 'string value' echo empty($obj->property); // Output 1 (means, that property is empty)
Означает ли это, что функция __get()
не вызывается при использовании empty()
?
Кстати. Я запускаю PHP версии 5.0.4
Да, вот что это значит. empty
– это не ваша повседневная функция, это языковая конструкция, которая не воспроизводится обычными правилами. Потому что на самом $obj->property
не существует, поэтому результат правильный.
Вам нужно будет реализовать __isset()
для empty
и isset
для работы.
Если вы хотите использовать empty
или isset
со свойствами, вам нужно объявить функцию-член, называемую __isset
.
Вот возможная реализация:
public function __isset($name) { $priv_name = "_{$name}"; return isset($this->$priv_name); }
if (isset(($this->$priv_name)))
Помещение () вокруг значения Object-> Property заставит его оценивать до вызова isset
.