empty()在对象的非空属性上返回TRUE

时间:2010-06-17 09:32:09

标签: php object

我有一个非常奇怪和意想不到的问题。

由于我不知道的原因,

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版

3 个答案:

答案 0 :(得分:11)

是的,这就是它的含义。 empty不是你的日常功能,它是一种不遵循正常规则的语言结构。因为实际上$obj->property不存在,所以结果是正确的。

emptyisset需要implement __isset()才能正常工作。

答案 1 :(得分:5)

如果要对属性使用emptyisset,则需要声明名为__isset的成员函数。

这是一个可能的实现:

public function __isset($name)
{
    $priv_name = "_{$name}";

    return isset($this->$priv_name);
}

答案 2 :(得分:-1)

if (isset(($this->$priv_name)))

对象 - >属性值周围加上()会强制在调用isset之前对其进行评估。