将对象评估为布尔值

时间:2011-04-06 20:57:36

标签: php class object evaluation

请考虑以下事项:

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

$obj = new MyClass();

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

PHP将我的对象评估为true,因为它有成员变量。这个逻辑可以以某种方式被覆盖吗?换句话说,当我被视为布尔值时,我可以控制我的类的对象将被评估的内容吗?

6 个答案:

答案 0 :(得分:20)

  

PHP将我的对象评估为true,因为它有成员变量。

这是不正确的。 PHP实际上将$obj评估为true,因为它包含一个对象。它与对象的内容无关。您可以通过从类定义中删除成员来验证这一点,在选择if / else的哪个分支时不会有任何区别。

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

null
array()
""
false
0

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

答案 1 :(得分:15)

您可以做的最好的事情是使用__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

答案 2 :(得分:7)

不,你不能。不幸的是,php中的boolean casting不可修改,并且当转换为布尔值时,对象将始终返回true。

由于你明确有一些逻辑意味着放在那个控制语句中,为什么不在你的对象上定义一个方法(比如“isValid()”)来检查你想要检查的条件,然后替换:

if ($obj)

使用:

if ($obj->isValid())

答案 3 :(得分:2)

您可以为php7使用小扩展名:https://github.com/p1ncet/obcast。正如您在描述中看到的那样,它允许通过实现新的内部接口Boolable将对象强制转换为boolean:

$obj = new class implements Boolable {
    public $container = [];
    public function __toBoolean() {
        return count($this->container) > 0;
    }
};

var_dump((bool) $obj);

$obj->container = [1];
var_dump((bool) $obj);

输出:

bool(false)
bool(true)

答案 4 :(得分:0)

对于迟到感到抱歉,但我只是玩了类似的任务,并且做了某种黑客/解决方法。请注意调用"$object"方法的__toString模式。

class tst {
  public $r = true;
  function __toString() { return $this->r ? "1" : "0"; }
}
$object = new tst();
$object->r = true;
echo '<br />1: ';
if ("$object") echo 'true!'; else echo 'false!'; // "$object" becomes "1" == true
//echo "$object" ? 'true!' : 'false!';

$object->r = false;
echo '<br />0: ';
echo "$object" ? 'true!' : 'false!'; // "$object" becomes "0" == false

输出:

1: true!
0: false!

答案 5 :(得分:-2)

你可以这样做: (bool)$ yourObject