2013-04-04 183 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