2012-08-02 128 views
11

我觉得我在这里错过了一些东西。我一直在使用PHP的empty()函数来判断变量是否为空。我想用它来确定一个对象的属性是否为空,但不知何故它不起作用。这里有一个简单的类来说明问题确定对象属性是否为空

// The Class 
class Person{ 
    private $number; 

    public function __construct($num){ 
     $this->number = $num; 
    } 

    // this the returns value, even though its a private member 
    public function __get($property){ 
     return intval($this->$property); 
    } 
} 

// The Code  
$person = new Person(5); 

if (empty($person->number)){ 
    echo "its empty"; 
} else { 
    echo "its not empty"; 
} 

所以基本上,$person对象应在其数字属性的值(5)。正如你可能猜到的那样,问题在于php会回应“空洞”。但它不是!

但是,如果我将属性存储在一个变量中,然后对其进行评估,它确实有效。

那么确定对象属性是否为空的最佳方法是什么?谢谢。

回答

0

请检查返回值是否为null。应该给你正确的答案。

18

你需要实施__isset()魔法。

__isset()通过在不可访问的属性上调用isset()或empty()来触发。

public function __isset($property){ 
    return isset($this->$property); 
} 
+3

我喜欢它,当我发布一个正确的答案,但有人发布了一个更正确的答案。 +1 – Fluffeh 2012-08-02 03:25:14

+0

这可能是......你这个聪明的人...... – blee908 2012-08-02 03:26:20

0
if (empty(($person->number))) 

/* OR */ 

if (!isset($person->nothing) || empty(($person->nothing))) 

把()周围的对象 - >属性值将迫使它在调用空进行评估。

+0

注意:未定义的属性:Person :: $ number – 2016-11-02 13:40:35

+0

@BradKent,因为评估你收到一条通知,试图使用一个未定义的变量(属性值)。如果你的财产可能会变为null/undefined,那么你首先需要检查isset。 (!isset($ person-> nothing)|| empty(($ person-> nothing))) – 2016-11-07 16:38:18