Php 将对象求值为布尔值

Php 将对象求值为布尔值,php,class,object,evaluation,Php,Class,Object,Evaluation,考虑以下几点: class MyClass { private $var1 = "apple"; private $var2 = "orange"; } $obj = new MyClass(); if($obj) { // do this } else { // do that } PHP将我的对象计算为true,因为它有成员变量。这一逻辑能否以某种方式被推翻?换句话说,我可以控制我的类的对象在作为布尔值处理时的求值结果吗 PHP将我的对象计算为true,因为它有成员变

考虑以下几点:

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

$obj = new MyClass();

if($obj) { 
  // do this
}
else {
  // do that
}
PHP将我的对象计算为true,因为它有成员变量。这一逻辑能否以某种方式被推翻?换句话说,我可以控制我的类的对象在作为布尔值处理时的求值结果吗

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

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

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

null
array()
""
false
0

有关转换为布尔值时被视为
false
的所有值的列表,请参见PHP文档中的。

不,不能。不幸的是,php中的布尔型转换是不可修改的,当对象转换为布尔型时,总是返回true

既然您显然有一些要放在该控制语句中的逻辑,为什么不在对象上定义一个方法(比如“isValid()”)来检查您希望检查的条件,然后替换:

if ($obj)
与:


最好使用
\u 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
你可以这样做: (bool)$yourObject


will

您可以对php7使用小扩展名:。从描述中可以看出,它允许通过实现新的内部接口Boolable将对象强制转换为布尔值:

$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)

很抱歉迟到了,但我只是做了类似的工作,并做了一些变通。请注意,
“$object”
模式,它调用
\uu 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

不,到目前为止,我们只能在字符串转换中控制它。为什么需要有这种不寻常的行为?您可以达到的最佳效果是
if($obj())
if($obj”)
if(count($obj))
而不是布尔求值。True。为了澄清OP,
$obj
不是对象。相反,它是对对象位置的引用,PHP使用它来查找内存中实际对象开始的位置。
“PHP将我的对象计算为true,因为它有成员变量。”这是不正确的。
实际上,这在PHP4中是正确的,但PHP5将行为更改为您所描述的。不太相关,但历史上很有趣。是的,我想这是我必须要做的,但我只是想简化一点编码。奇怪的是,为什么这不是一个内置函数。由于PHP5.2中出现了
\uuuuuuToString()
,我希望会有这样一个函数,因为我希望PHP5.2I使用
\uuuuToPrimitive()
\uToValue()
或类似的函数来处理任何非对象值。
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!