我所处的情况并不复杂,但我花了一段时间来计算它。
class A {
private $data = array('key' => 'value');
public function __get($name){
return $this->data[$name];
}
}
$a = new A();
var_dump(empty($a->key)); // TRUE
我想这是因为empty
由于某种原因检查类结构而不是在括号内运行代码。为什么不按预期评估此代码?
这是一个错误还是为什么它无法正常工作?
答案 0 :(得分:6)
首先,在PHP中,您需要使用$this->
来访问类$data
之类的变量(所以$this->data
代替$data
)。在使用其他语言一段时间后很容易忘记,但如果您未将错误报告设置为E_ALL
而开发代码,则应将其设置为该值。在开发期间将其设置为E_ALL
可让您更轻松地找到(潜在)错误,例如此错误,并将提高您的代码质量。
要解决您的实际问题,为了确定是否为魔术变量设置变量,您需要添加__isset
魔术方法(manual):
<?php
class A {
private $data = array('key' => 'value');
public function __get($name){
return $this->data[$name];
}
public function __isset($name){
return array_key_exists($name, $this->data);
}
}
$a = new A();
var_dump(empty($a->key)); // it's FALSE now