Используя PHP 5.3 я испытываю странный / неинтуитивное поведение при применении empty()
к свойствам динамического объекта, выбранным через __get()
функция перегрузки. Рассмотрите следующий фрагмент кода:
<?php
class Test {
protected $_data= array(
'id'=> 23,
'name'=> 'my string'
);
function __get($k) {
return $this->_data[$k];
}
}
$test= new Test();
var_dump("Accessing directly:");
var_dump($test->name);
var_dump($test->id);
var_dump(empty($test->name));
var_dump(empty($test->id));
var_dump("Accessing after variable assignment:");
$name= $test->name;
$id= $test->id;
var_dump($name);
var_dump($id);
var_dump(empty($name));
var_dump(empty($id));
?>
Вывод этой функции следующие. Сравните результаты empty()
проверяет первые и вторые наборы результатов:
Набор № 1, неожиданный результат:
string(19) "Accessing directly:"
string(9) "my string"
int(23)
bool(true)
bool(true)
Ожидание Набора № 1 для возврата того же как Набора № 2:
string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)
Это является действительно экранирующим и неинтуитивным. Свойства объектов производят непустые строки, но empty()
полагает, что они пустые строки. Что продолжается здесь?
На основе чтения пустой
ручной страницы и комментариев и комментариев Ctrl-F для ISSET и / или двойных подчеркиваний), похоже, что это известное поведение, и если вы хотите, чтобы ваш __ __ Set
и __ Get
Методы Пустые
, чтобы играть приятно вместе, есть неявное предположение, которое вы реализуете __Set
Magic Magic.
Это немного неприятное и запутанное, но это имеет тенденцию происходить с большинством мета-программирования, особенно в такой системе, как PHP.
В этом примере пустые () вызывает функцию перегрузки __set (), а не функцию перегрузки __get (). Попробуйте это:
class Test {
protected $_data= array(
'id'=> 23,
'name'=> 'my string'
);
function __get($k) {
return $this->_data[$k];
}
function __isset($k) {
return isset($this->_data[$k]);
}
}