将对象计算为布尔值

2022-08-30 17:30:44

请考虑以下事项:

class MyClass
{
  private $var1 = "apple";
  private $var2 = "orange";
}

$obj = new MyClass();

if($obj) { 
  // do this
}
else {
  // do that
}

PHP 将我的对象计算为 true,因为它具有成员变量。这个逻辑能以某种方式被推翻吗?换句话说,当将类的对象视为布尔值时,我是否可以控制其计算结果?


答案 1

PHP 将我的对象计算为 true,因为它具有成员变量。

这是不正确的。PHP实际上的计算是因为它包含一个对象。它与对象的内容无关。您可以通过从类定义中删除成员来验证这一点,它不会对选择if/else的哪个分支产生任何影响。$objtrue

如果 PHP 包含对对象的引用,则无法使 PHP 将变量评估为 false。您必须为变量分配一些“falsy”,其中包括以下值:

null
array()
""
false
0

请参阅 PHP 文档中的转换为布尔值,以获取转换为布尔值时被视为的所有值的列表。false


答案 2

您可以做的最好的方法是使用:__invoke

class MyObject {

    private $_state;

    public function __construct($state = false) {
        $this->_state = $state;
    }

    public function __invoke() {
        return $this->_state;
    }

}

$true  = new MyObject(true);
$false = new MyObject(false);

var_dump($true());   // true
var_dump($false());  // false

推荐