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实际上$obj
是true
因为它拥有一个对象而进行评估.它与对象的内容无关.您可以通过从类定义中删除成员来验证这一点,在选择if/else的哪个分支时不会有任何区别.
如果它保存对象的引用,则无法使PHP将变量评估为false.您必须首先为变量分配以下内容之一:
null
array()
""
false
0
Run Code Online (Sandbox Code Playgroud)
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)
不,你不能.不幸的是,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)