0

さて、作業中に、関連するデータ/オブジェクトをフェッチするこの方法が素晴らしいものであることがわかりました。

例として、私はいくつかの関連オブジェクトを内部に持つこのクラスを持っています:

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 のインスタンスが必要ですが、その言語と地域は今は必要ありません。

別のケースではそれらが必要なので、それらをプロパティとして主張し、魔法のメソッドがそれらを初めて取得します。

$country = new Country();

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

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

このオンデマンドメソッド (関連オブジェクトのネストされたループも回避する) には名前がありますか? 多分プロパティの遅延読み込みオンデマンド プロパティ?

4

1 に答える 1

3

別のケースでは、[...] はそれらを初めて取得します。

初期化は適切な表現です。これは、遅延初期化と呼ばれます。

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

だから私はそれらをプロパティとして主張し、マジックメソッドはそれらを取得します

これは、プロパティのオーバーロードと呼ばれます。

http://php.net/__get

編集:

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

于 2011-02-09T15:15:24.740 に答える