2014-08-29 68 views
1

我的情況並不複雜,但花了我一段時間才弄明白。空()和魔法__get()

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檢查類結構由於某種原因,而不是運行括號內的代碼。爲什麼不按預期評估此代碼?

這是一個錯誤或爲什麼它不能正常工作?

+2

你不應該使用'$回報data [$ name];'但是'return $ this-> data [$ name];',我猜? – 2014-08-29 19:15:32

+0

@KIKOSoftware好耶我只是寫了這個問題,簡單的錯誤。將修復它,謝謝 – 2014-08-29 19:19:29

回答

3

首先,在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 
+0

關於'$ this'的部分,我很抱歉,我只是寫了這段代碼只是爲了這個問題,這是一個簡單的錯誤,道歉。謝謝! – 2014-08-29 19:22:16

+0

在C#和PHP之間切換時,這是我的常見錯誤。 ;)如果你正在學習魔術方法,我建議先看看[這個班級](https://github.com/yiisoft/yii/blob/master/framework/base/CComponent.php#L177);我真的很喜歡這種方式(雖然有點複雜)。 – 2014-08-29 19:28:56

+0

但是,我想知道,如果這種方法非常直截了當,爲什麼不自動實現呢?我的意思是我只需要編寫'function __isset($ name){return isset($ this-> data [$ name]); }'。我想知道他們爲什麼沒有配置它默認運行:? – 2014-08-29 19:30:36

相關問題