2011-02-09 18 views
0

好的,在工作中我們發現這種獲取相關數據/對象的方法是非常棒的。幫助我認識到我在這個php例子中使用的技術並命名它

權的例子,我有這個類裏面的一些相關對象:

class Country { 

private $language; //$language will be an object of class Language 
private $regions; //$regions will be an ARRAY of Region objects 

//in the constructor i don't load regions or language 

//magic method 
    public function __get($name) { 

     $fn_name = 'get_' . $name; 

     if (method_exists($this, $fn_name)) { 
      return $this->$fn_name(); 
     } else { 
      if (property_exists($this, $name)) 
       return $this->$name; 
     } 

     return $this->$name; 
    } 

    public function get_language() { 

     if (is_object($this->language)) return $this->language; 

     $this->language = new Language($params); //example 

     return $this->language; 
    } 

    public function get_regions() { 

     if (is_array($this->regions)) return $this->regions; 

     $this->regions = array(); 

     $this->regions[] = new Region('fake'); 
     $this->regions[] = new Region('fake2'); 

     return $this->regions; 
    } 
} 

這樣的想法是:

我想國家的實例,但我不需要它的語言和地區現在。

在另一種情況下,我需要他們,所以我聲稱他們作爲屬性,魔術方法只爲我第一次檢索它們。

$country = new Country(); 

echo "language is". $country->language->name; 

echo "this country has ". sizeof($country->regions)." regions"; 

點播方法(避免相關對象的嵌套循環也)有一個名字? 也許懶加載屬性按需房地產

+3

'懶加載'是通常名稱 – Mchl 2011-02-09 14:56:08

回答

3

在另一種情況下,我需要它們[...],我檢索它們只有第一次

初始化將是正確的措辭。這被稱爲延遲初始化

http://en.wikipedia.org/wiki/Lazy_initialization

,所以我要求作爲屬性,以及魔術方法檢索它們

這被稱爲超載特性的。

http://php.net/__get

編輯:

我不認爲有兩個組合的期限。你可以將兩者結合起來,得到類似於「通過重載對屬性進行惰性初始化」。

+0

thx爲維基百科提示! – apelliciari 2011-02-09 15:25:41

相關問題