質問

システムのさまざまな部分でオブジェクトが使用されている複数のパブリックプロパティを備えたクラスがあります。問題は、クラスのオブジェクトを使用している各場所にそれらのパブリックプロパティの一部のみをロードする必要があることです。

私が使用できる方法はありますか? __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
}
役に立ちましたか?

解決

あなたのコードで、

  • 関数の名前を変更します magicLoading__get,
  • あなたに戻り声明を追加する 'load...'メソッド
  • 変数がまだ初期化されていないことを確認してください。

そして、それは機能します!

他のヒント

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

のために __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;
  }
}

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top