2010-12-01 4 views
2

私は、オブジェクトがシステムのさまざまな部分で使用されている複数のパブリックプロパティを持つクラスを持っています。問題は、クラスのオブジェクトを使用している各場所でこれらのパブリックプロパティの一部だけをロードする必要があることです。プロパティのリスト全体をロードするたびに永久にかかるためです。PHPで必要なときにのみ変数をロードする方法

__autoloadまたは同様の関数を使用して、呼び出された時点で異なる変数をロードする関数を呼び出す方法はありますか?

など。

class Bread { 
    public 
    $Ingredients, 
    $Price, 
    $Color; 

    public function magicLoading($var) { 
    switch($var) { 
     case "Ingredients" : return loadIngredients(); 
     case "Price"  : return loadPrice(); 
     case "Color"  : return loadColor(); 
     default   : break; 
    } 
    } 

    public function loadIngredients() { 
    $this->Ingredients = ... 
    } 
} 

foreach($Bread->Ingredients as $Ingredient) { 
    //do stuff here 
} 

答えて

1

  • __getに機能magicLoadingの名前を変更するあなたの 'load...' メソッドに変数がまだ初期化されていないことを
  • チェックをreturn文を追加します。

これは機能します。

0

はい、あなたはクラスの(まだ初期化されない)プロパティが読み込まれるたびに呼び出されるメソッド魔法__getを作成することができます。

1

重複した回答のように見える投稿を仲間に謝罪していますが、何かを見逃しています。

__get()__set()フックが正しく機能するためには、問題でのメンバ変数はすべてで宣言することはできません - 単に十分ではありません宣言されていますが、未定義されています。

これはあなたがこの方法でアクセスできるようにしたいすべての変数の宣言を削除する必要があります意味(すなわち、public $Ingredients;など)

エルゴ、あなたのクラスは、このようになります。あなたのコードで

class Bread 
{ 
    /* No variable declarations or the magic methods won't execute */ 

    protected function loadIngredients() 
    { 
    $this->Ingredients = ... 
    } 

    public function __get($var) 
    { 
    switch($var) 
    { 
     case "Ingredients" : $this->loadIngredients(); break; 
     case "Price"  : $this->loadPrice(); break; 
     case "Color"  : $this->loadColor(); break; 
     default   : throw new Exception("No case for $var"); 
    } 
    return $this->$var; 
    } 
} 
+1

実行時に作成されたプロパティがpublicにデフォルトでどのように設定されているかを明示的に説明する価値があると思うので、将来の '__get()'呼び出しをバイパスします。 (したがって、このメソッドは、読み込み専用の遅延ロードが必要な場合にはうまくいかないが、それが問題でない場合は、利用するのが良い 'トリック'である。) – Matthew

+0

詳細、konforce。言及しておきたいことだが、Catはすでにそれらを「公的」と定義していたが、この場合は問題ではないと私は考えている。 –

関連する問題