2014-11-24 68 views
1

從來就試圖瞭解是否有一個神奇的功能在PHP,當我試圖訪問一個對象的屬性類似於下面可以觸發功能。有沒有一種方法,使__get和__set觸發類定義,但空性

class User { 
     public $groups; 

     function loadGroups(){ 
      $this->groups[] = "a list of groups"; 
     } 

     function __get($name){ 
      // Trigger on defined property such as groups 
      if($name == "groups"){ 
       $this->loadGroups(); 
       return $this->groups; 
      } 
     } 
} 

$user = new User(); 
foreach($user->groups as $group) // Is it possible to load $user->groups when it's accessed? 
     echo $group; 

我知道,如果財產是連壽的屬性設置爲null或undefined類中定義的__get & __set不會觸發,但沒有任何其他的方式來觸發買點定義的屬性還是必須爲所有這些屬性創建getter和setter,並確保在我需要訪問該屬性時始終調用這些屬性,並且要確保在訪問它時加載它?我希望不是因爲它會導致我正在使用的當前系統發生很多變化。

我很感激的任何信息或幫助我能關閉這個章節。

// ZarToK

+0

負荷? – exussum 2014-11-24 16:57:39

+0

@exussum那麼將工作ofc,但我不想加載更多然後是需要的,這是一個小例子類。實際的類中含有大量的這些陣列和獲取它從數據庫 – ZarToK 2014-11-24 17:01:16

+0

名單你就不能註釋掉$組的聲明在這種情況下,然後在__get確定要裝入的一個。 – Dexa 2014-11-24 17:03:35

回答

0

我得到你想要做什麼,但我不認爲你問的問題的權利。你顯然是在試圖做延遲加載。

沒有做你的要求是什麼神奇的方法,但你基本上可以創建這樣的事情。有兩種選擇:「創建getter/setters」選項 - 這更符合Java開發人員的要求,或者存在「保護變量並使用魔術方法」選項,這對框架API來說往往是「好的」選項但可能有點混亂。

class User { 
    protected $groups; 

    private function loadGroups() { 
     $this->groups[] = 'a list of groups'; 
    } 

    public function __get($name) { 
     if ($name == 'groups' && is_null($this->groups)) { 
      $this->loadGroups(); 
      return $this->groups; 
     } 
    } 
} 

另外,在更多的Java方法:在__construct

class User { 
    protected $groups; 

    private function loadGroups() { 
     $this->groups[] = 'a list of groups'; 
    } 

    public function getGroups() { 
     if (is_null($this->groups)) { 
      $this->loadGroups(); 
     } 
     return $this->groups; 
    } 
} 
+0

這就是我與,受保護的方法去,我會建議Java的方式向任何人誰擁有一個全新的開始,但在我的情況下,我必須做出,而不會影響應用程序的改變已經使用這些的foreach循環,我不得不爲例。感謝@Navarr和AbraCadaver在一個簡短的版本中提到了這一點。 – ZarToK 2014-11-24 20:24:30

0

__get()__set()用於讀/寫數據從/到不可訪問屬性。在這種情況下不可訪問的屬性將是privateprotected,從不public。如果他們需要成爲public,那麼從函數返回有什麼問題?

class User { 
     public $groups; 

     function loadGroups(){ 
      $this->groups[] = "a list of groups"; 
      return $this->groups; 
     } 
} 

$user = new User(); 
foreach($user->loadGroups() as $group) 
    echo $group;