0

クラス(以下のような)があり、関数で変数(以下:$ this-> example)を設定したが、クラスの先頭で変数を宣言していない場合(たとえば、var $ example;)、どこでどのようにできますかこの変数を使用しますか?別の関数ですぐに使用してみましたが、機能しませんでした(間違いを犯した可能性がありますが、クラスのトップで宣言した後は機能しました)

ビューで使用できる変数を設定するためにSymfonyでこれを見てきました。また、いくつかの例を挙げて、Phormsでこれに出くわしました。

申し訳ありませんが、これが明らかな場合は、変数の名前を取得するなど、これらの変数をどのように使用できるかを理解したいと思います(たとえば、$ this-> example、名前は「example」を意味します)。

class ExampleClass{
  var $another_var;
  function __construct($data){
    $this->example = $data;
    $this->another_var = $data;
  }

  function exampleFunction(){
    $test = $this->example; //this doesnt work
    $another_test = $this->another_var; //this obviously does
  }
}

どんな助けでも大歓迎です

よろしく

ルーク

編集: (DrColossusへの私の返信から)

関数に任意の変数名を設定し、別の関数でその名前で設定された変数を取得できるようにしたいです。たとえば、Symfonyでは、アクションクラス関数で$ this-> complete_random_name = $ xを設定してから、ビューで設定できます。 $completly_random_nameを使用できます。symfonyが親クラスの最上位に変数名の可能なすべての組み合わせを設定する方法はありません。

4

4 に答える 4

11

__get通常はこれを行うべきではないという話をスキップして、PHPの魔法と__set関数を使用して目的を達成することができます。

class MyClass {
  // add one member var that holds all the data
  private $myMagicData = array();

  private $another_var;

  function __construct($data){
    $this->example = $data; // this will auto-call the __set function
    $this->another_var = $data; // this won't, since $this->another_var was declared above
  }

  function __get($name) {
    return array_key_exists($name, $this->myMagicData) ? $this->myMagicData[$name] : null;
  }

  function __set($name, $value) {
    $this->myMagicData[$name] = $value;
  }

  function exampleFunction(){
    $test = $this->example; // this will auto-call the __get function
    $another_test = $this->another_var; // this won't
  }
}

これらおよびその他の魔法の機能に関するドキュメント。


なぜあなたはこれをすべきではないのですか。

私の意見では、魔法__get__set関数を使用すると、プログラミングの練習が不十分になります。有名な例を使って説明しましょう。グラスが半分満たされている場合、グラスは半分満たされているのですか、それとも半分空になっているのですか?プログラマーの観点からの正解は、ガラスが大きすぎるということです。つまり、上記のように魔法の関数を追加すると、変数を割り当て続けることができ、それは気になりませんが、それらは必要ですか?

時間の経過とともにコードが変更され、以前に割り当てられていた古い変数が不要になる場合があります。通常は、変数宣言を削除するだけです。つまり、クラスが消費する(不要な)メモリが少なくなります。古い割り当ての1つを削除するのを忘れた場合は、すぐにわかります。魔法の関数機能を使用して、必要な変数と不要な変数をどのように追跡しますか?

コードは、主に人間が読むために、そして二次的にマシンが実行するためにのみ書かれるべきであることを忘れないでください。2人目の人があなたに加わって、ビューでどの変数にアクセスできるのか疑問に思った場合print_r($this->myMagicData)、変数が存在するクラスのセクションを見るだけでなく、変数を割り当てるコードを実行する必要があります。宣言しました。

そしてもちろん、呼び出される魔法の関数のオーバーヘッドもあります。これは、状況に応じて問題になる場合とそうでない場合があります。

したがって、要約すると、必要な変数を手動で宣言すると次のようになります。

  1. 現在使用しているデータと使用していないデータを追跡します
  2. あなたと他の人の両方にとってあなたのコードを読みやすくします
  3. より高速に実行

お役に立てれば!

于 2010-06-24T09:38:36.943 に答える
2
class ExampleClass{
  private $another_var;
  private $example;

  public function __construct($data){
    $this->example = $data;
    $this->another_var = $data;
  }

  public function getExample() {
    return $this->example;
  }

  public function setExample($example) {
    $this->example = $example;
  }

  public function exampleFunction()
    $test = $this->example; //now that you have a private $example, this will work
    $another_test = $this->another_var; //this obviously does
  }
}

プライベート変数にアクセスするには、パブリックのゲッター/セッターを使用します。

Aistinaの編集 は私よりも速かった。彼の例は、任意の変数名にアクセス/取得する方法を示しています。

于 2010-06-24T09:22:20.807 に答える
0

クラスプロパティはデフォルトでパブリックとして定義されていますが、そうすべきではありません。プロパティをprivate/protectedで定義し、クラスの外部からそれらを操作するためにgetter/setterメソッドを定義する必要があります。後で保守する方がはるかに簡単です。

于 2010-06-24T09:18:24.777 に答える
0

私はこれについてはプロではありませんが、OOで条件付けられたマインドは、使用されている言語に関係なく、クラスメンバー変数を定義しないのは悪い習慣だと言っています。

おそらく、あなたが参照したフレームワークは、メンバーがスーパークラスで定義されているサブクラスでこのパターンを使用していますか?

2番目の質問:phpのリフレクションクラスを確認する必要があり ます。リフレクションは、クラスの構造(コンストラクター、メソッド、プロパティ)を見つけるのに役立ちます。

于 2010-06-24T09:24:18.163 に答える