具有以下代码
class test {
private $name;
public function __get($name){
return $name;
}
public function __set($name,$value){
$this->name = $value;
}
}
$obj = new test();
$obj->a = 2;
if (!empty($obj->a)) {
echo 'not empty';
}我是__isset。但是这没有被定义,所以它总是返回空。检查非空属性的最佳方法是什么?
更新:更改类不是一个解决方案,因为它是第三方组件,它必须保持不变。
发布于 2010-09-17 21:41:30
如果不能更改类,我认为唯一可能的解决方法是使用临时变量。
$obj->a = 2;
$test = $obj->a;
if (!empty($test)) {
echo 'not empty';
}发布于 2012-12-27 21:52:06
我知道我来得太晚了,但我把这篇文章贴出来是为了给那些遇到这个问题的人一个启发。
首先,我认为测试类是错误的,如果这真的是第三方组件所做的,我会把它扔掉,因为它是垃圾。您真的希望所有属性名称都在内部映射到单个属性'name',从而覆盖彼此吗?您真的希望所有属性名都作为属性值返回吗?代码的应该如下所示:
class test {
public function __get($name){
return $this->$name;
}
public function __set($name,$value){
$this->$name = $value;
}
}其次,您可以对类进行更改,即使它必须保持不变。这就是继承的要点。这是open-closed principle。如果函数不正确,只需像这样扩展test来更正它们:
class test {
private $name;
public function __get($name){
return $name;
}
public function __set($name,$value){
$this->name = $value;
}
}
class my_test extends test
{
public function __get($name)
{
return $this->$name;
}
public function __set($name,$value){
$this->$name = $value;
}
}您不应该定义__isset(),因为校正后的代码将执行它应该执行的操作,但是如果您这样做了,您也可以在这里执行此操作。
现在,下面的代码将做它应该做的事情(注意类名的更改):
$obj = new my_test();
$obj->a = 2;
if (!empty($obj->a)) {
echo 'not empty';
}发布于 2010-09-17 20:35:48
当与除变量以外的任何变量一起使用时,它没有意义;例如,空(addslashes ($ name))没有意义,因为它将被除变量之外的任何其他变量检查为值为FALSE的变量。
在您的例子中,您应该使用类型转换:
if ((bool)$obj->a) { echo‘非空’;}
https://stackoverflow.com/questions/3735295
复制相似问题