将对象评估为布尔值

Nik*_*mov 20 php evaluation class object

考虑以下:

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

$obj = new MyClass();

if($obj) { 
  // do this
}
else {
  // do that
}
Run Code Online (Sandbox Code Playgroud)

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

mea*_*gar 24

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

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

如果它保存对象的引用,则无法使PHP将变量评估为false.您必须首先为变量分配以下内容之一:

null
array()
""
false
0
Run Code Online (Sandbox Code Playgroud)

  • 真正.为了澄清OP,`$ obj`不是对象.相反,它是对象位置的*引用*,由PHP用于查找实际对象开始的内存中的点. (2认同)

net*_*der 16

你能做的最好的就是__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
Run Code Online (Sandbox Code Playgroud)


sch*_*tyl 7

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

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

if ($obj)
Run Code Online (Sandbox Code Playgroud)

有:

if ($obj->isValid())
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用 php7 的小扩展:https : //github.com/p1ncet/obcast。正如您从描述中看到的,它允许通过实现新的内部接口 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);
Run Code Online (Sandbox Code Playgroud)

输出:

bool(false)
bool(true)
Run Code Online (Sandbox Code Playgroud)

  • 奇怪为什么这不是内置函数。由于自 PHP 5.2 以来`__toString()` 的存在,我希望会有这样的一个 (4认同)