我有一个非常奇怪和意想不到的问题。
由于我不知道的原因, 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版
答案 0 :(得分:11)
是的,这就是它的含义。 empty
不是你的日常功能,它是一种不遵循正常规则的语言结构。因为实际上$obj->property
不存在,所以结果是正确的。
empty
和isset
需要implement __isset()
才能正常工作。
答案 1 :(得分:5)
如果要对属性使用empty
或isset
,则需要声明名为__isset
的成员函数。
这是一个可能的实现:
public function __isset($name)
{
$priv_name = "_{$name}";
return isset($this->$priv_name);
}
答案 2 :(得分:-1)
if (isset(($this->$priv_name)))
在对象 - >属性值周围加上()会强制在调用isset
之前对其进行评估。