2013-04-04 213 views
4
$user = new User(1); 

var_dump($user->ID); 
if (empty($user->ID)) 
    echo "empty"; 

// output string(2) "77" empty 

那么为什么empty()返回true即使当$user var不为空?empty()返回错误结果

我的User类的相关部分:

class User { 
    protected $data = null; 

    public function __construct($userID) { 
     // sql select 
     $this->data = $sqlResult; 
    } 

    // ... 

    public function __get($name) { 
     if (isset($this->data[$name])) 
      return $this->data[$name]; 
     else 
      return null; 
    } 

} 

UPDATE:

所以我更新了我的用户类,并增加了__isset()方法

public function __isset($name) { 
     if (isset($this->data[$name]) && !empty($this->data[$name])) 
       return true; 
     else 
       return false; 
} 

这使我到另一个问题: 当我在我的非空var empty($user->ID)上致电empty()它将r eturn错误,但在使用isset($user->ID)时,声明的变量为空(例如, $user->ID = '')它也会返回false,因为isset()会在类里面调用__isset(),对吧?

有没有办法解决这个问题? PHP的笔记,我应该重载的属性复制到一个局部变量,这似乎太多的文书工作对我来说)

+3

答案就在这里:http://stackoverflow.com/questions/6241039/php-empty-doesnt-work-with-a -getter-method – graup 2013-04-04 14:23:17

+1

它正在评估'User'类中是否存在'ID'。这是区分大小写 – karthikr 2013-04-04 14:23:44

+0

谢谢你,那应该解决我的问题。 – Chris 2013-04-04 14:28:48

回答

8

empty()不叫__get()。您需要实施__isset()

+0

很好的答案!你应该考虑举一个简短的例子。仅供将来参考。 – hek2mgl 2013-04-04 14:25:02

+0

更新了我的答案,请再检查一次!谢谢! – Chris 2013-04-04 14:49:07

2

manual报价:

注意

这是不可能在其他语言结构使用重载性能比isset()函数。这意味着如果在重载属性上调用empty(),则不会调用重载的方法。

+0

更新了我的答案,请再检查一次!谢谢! – Chris 2013-04-04 14:49:49

2

根据该文档,你应该重载__isset()空工作

+0

更新了我的答案,请再检查一次!谢谢! – Chris 2013-04-04 14:50:06