2011-04-06 109 views
18

考虑以下几点:评估对象为布尔

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

$obj = new MyClass(); 

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

PHP评估我的对象为真,因为它有成员变量。不知怎的,这个逻辑能否被覆盖?换句话说,当我的类的对象作为布尔值对待时,我可以控制什么样的对象会被评估为什么?

+0

没有,作为然而,我们只能控制它串铸造。 – Wrikken 2011-04-06 21:00:39

+0

为什么你需要有这种不寻常的行为? – 2011-04-06 21:04:44

+1

您可以实现的最好方法是'if($ obj())'或'if(“$ obj”)'或者'if(count($ obj))'代替布尔评估。 – mario 2011-04-06 21:12:07

回答

16

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

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

如果PHP持有对某个对象的引用,则无法将其评估为false。您必须首先将以下变量之一指定给变量:

null 
array() 
"" 
false 
0 
+2

是的。为了澄清OP,'$ obj'不是对象。相反,它是对象位置的一个*引用,由PHP用来查找实际对象开始的内存中的点。 – AgentConundrum 2011-04-06 21:10:05

6

不,您不能。不幸的是,在PHP中进行布尔转换是不可修改的,并且一个对象在转换为布尔值时总是返回true。

既然你显然有一些逻辑,你的意思是在控制语句的地方,为什么不是你的对象上定义一个方法(说“的isValid()”),检查要检查,然后更换条件:

if ($obj) 

有:

if ($obj->isValid()) 
+0

是的,我想这是我必须做的,但我只是想简化编码。 – 2011-04-07 17:05:43

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

你能做到这样的: (布尔)$ yourObject

2

您可以使用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); 

输出:

bool(false) 
bool(true) 
+1

奇怪,为什么这不是一个内置函数。由于自PHP 5.2以来有'__toString()'的存在,我期望有这样的一个 – 2017-04-18 13:28:34

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!