2011-02-09 8 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

答えて

3

は、[...]私初回のみのためにそれらを取得します。

を初期化することが適切な言い回しになります。これは、遅延初期化と呼ばれます。

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

私は特性としてそれらを主張し、魔法の方法は、これは特性のオーバーロードと呼ばれ、それらを

を取り出します。

http://php.net/__get

EDIT:

私は2つの組み合わせのための用語はないと思います。両方を組み合わせて、「オーバーロードによるプロパティの遅延初期化」のようなものを取得できます。

+0

thx、ウィキペディアのヒント! – apelliciari

関連する問題