У меня очень странная и неожиданная проблема.
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 .