2010-09-17 165 views
2

具有下列代碼PHP魔術方法和空

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。但是這並沒有被定義,所以它總是返回空。檢查非空物業的最佳方法是什麼?

更新:更改類不是一個解決方案,因爲它是第3方組件,它必須保持不變。

+2

爲什麼不定義'__isset(? – 2010-09-17 12:32:25

+1

我做了一個更新,不能改班。 – danidacar 2010-09-17 13:39:11

回答

3

如果你不能改變類,我認爲唯一可能的解決方法是使用一個臨時變量。

$obj->a = 2; 

$test = $obj->a; 

if (!empty($test)) { 
    echo 'not empty'; 
} 
+2

我很害怕這個。 – danidacar 2010-09-17 13:47:47

0

與其他變量一起使用時沒有意義;即空(addslashes($ name))沒有意義,因爲它將被除變量之外的任何其他值檢查爲值爲FALSE的變量。

在你的情況,你應該使用類型轉換:

IF((布爾)$ obj->一){ 回聲 '不空'; }

+0

如果包含空字符串,則不起作用。 – danidacar 2010-09-17 13:40:34

0

變化

public function __set($name,$value){ 
     $this->name = $value; 
    } 
To 

public function __set($name,$value){ 
     $this->$name = $value; 
    } 

然後嘗試

+0

我做了更新,不能改班。 – danidacar 2010-09-17 13:39:59

1

我知道我是很晚纔到這裏聚會,但我張貼此爲edificationof任誰也碰到這個問題絆倒。首先,我認爲測試類是錯誤的,如果這真的是第三方組件的功能,那麼我會挑選它,因爲它是垃圾。你真的想要所有的屬性名稱內部映射到單個屬性的'名稱',從而相互覆蓋?你真的希望所有的屬性名稱都作爲屬性值返回嗎?該代碼應該是這樣的:

class test { 
    public function __get($name){ 
     return $this->$name; 
    } 
    public function __set($name,$value){ 
     $this->$name = $value; 
    } 
} 

其次,你可以改變類的,即使它有保持不變。這是繼承的關鍵。這是open-closed principle。如果函數是不正確的,只是延長測試這樣的改正:

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'; 
}