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!