确定对象属性是否为空

15

我感觉自己缺少了一些东西。我已经使用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 对象的 number 属性应该有一个值(5)。正如你可能已经猜到的那样,问题是 php 输出 "its empty"。但它不是空的!!!

然而,如果我将属性存储在一个变量中,然后进行评估,它确实可以工作。

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


我知道这是一个老问题,但我遇到了同样的问题,原因是作用域。这是因为属性被声明为私有的。如果它是受保护的或公共的,它将按预期工作。在我的情况下,实际上没有理由将属性设为私有,所以我改变了作用域。 - undefined
3个回答

26

你需要实现__isset()魔术方法。

当对不可访问属性调用 isset() 或 empty() 时,将会触发 __isset() 方法。

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

3
我喜欢当我发布的答案是正确的,但有人发表了更正确的答案。+1 - Fluffeh
岁月流逝,PHP 仍未得到修复。即使是 PHP 的“null 合并运算符”也是如此。 - Thomas

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

/* OR */

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

将Object->Property值放在()中,可以在调用empty之前强制对其进行求值。

注意:未定义属性:Person::$number。 - Brad Kent
@BradKent,由于您正在尝试使用未定义的变量(属性值),因此您收到了一条通知。如果您的属性可能为null/undefined,则首先要检查isset。(!isset($person->nothing) || empty(($person->nothing))) - Eric Shoberg

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接