2

システムのさまざまな部分でオブジェクトが使用されている複数のパブリックプロパティを持つクラスがあります。問題は、クラスのオブジェクトを使用している各場所で、これらのパブリックプロパティの一部のみをロードする必要があることです。これは、プロパティのリスト全体を毎回ロードするのに永遠に時間がかかるためです。

__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
}
4

3 に答える 3

1

重複した回答のように見えるものを投稿してくれた同僚に謝罪しましたが、彼らは何かを逃しました。

__get()and__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;
  }
}
于 2010-12-01T18:45:22.100 に答える
1

あなたのコードでは、

  • 関数の名前magicLoading__get、に変更します
  • load...' 'メソッドにreturnステートメントを追加します
  • 変数がまだ初期化されていないことを確認してください。

そしてそれは動作します!

于 2010-12-01T18:46:03.530 に答える
0

はい、クラスのプロパティ(まだ初期化されていない)が読み取られるたびに呼び出されるマジックメソッド__getを作成できます。

于 2010-12-01T18:29:59.480 に答える