2010-06-17 50 views
3

我有一個非常奇怪的和意想不到的問題。empty()在對象的非空屬性返回TRUE

empty()在非空屬性上返回TRUE,原因不明。

class MyObject 
{ 
    private $_property; 

    public function __construct($property) 
    { 
     $this->_property = $property; 
    } 

    public function __get($name) 
    { 
     $priv_name = "_{$name}"; 

     if (isset($this->$priv_name)) 
     { 
      return $this->$priv_name; 
     } 
     else 
     { 
      return NULL; 
     } 
    } 
} 

$obj = new MyObject('string value'); 

echo $obj->property;  // Output 'string value' 
echo empty($obj->property); // Output 1 (means, that property is empty) 

請問這意味着,該__get()神奇的功能是不使用empty()的時候叫什麼?

btw。我正在運行PHP版本5.0.4

回答

8

是的,那是什麼意思。 empty不是你的日常功能,它是一種不按常規規則播放的語言結構。因爲其實$obj->property不存在,所以結果是正確的。

您需要implement __isset()才能使用emptyisset

4

如果要使用帶屬性的emptyisset,則需要聲明名爲__isset的成員函數。

這裏是一個可能的實現:

public function __isset($name) 
{ 
    $priv_name = "_{$name}"; 

    return isset($this->$priv_name); 
} 
-1
if (isset(($this->$priv_name))) 

()圍繞對象 - >屬性值將迫使它之前要調用isset評價。