使用PHP 5.3当通过__get()过载函数获取的动态对象属性应用empty()时,我遇到了奇怪/非直观的行为。请考虑以下代码片段:
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)
期望Set#1返回与Set#2相同:
string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)
这真的是令人困惑和非直观的。对象属性输出非空字符串,但是empty()将它们视为空字符串。这里发生了什么?