请考虑以下事项:
class MyClass
{
private $var1 = "apple";
private $var2 = "orange";
}
$obj = new MyClass();
if($obj) {
// do this
}
else {
// do that
}
PHP将我的对象评估为true,因为它有成员变量。这个逻辑可以以某种方式被覆盖吗?换句话说,当我被视为布尔值时,我可以控制我的类的对象将被评估的内容吗?
答案 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)
由于你明确有一些逻辑意味着放在那个控制语句中,为什么不在你的对象上定义一个方法(比如“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
将