1

私は最近このコードの質問に出くわしましたが、なぜこれらの結果が生成されるのかについて非常に不明です。

Class Magic {
   public $a ="A";
   protected $b = array( "a"=>"A", "b"=>"B", "c"=>"C");
   protected $c = array(1,2,3);

   public function __get($v ) {
      echo "$v,";
      return $this->b[$v]; //internal so fine with protected.
   }

   public function __set($var, $val ) {
      echo "$var: $val,";
      $this->$var = $val;
   }
}

$m = new Magic();

//1
//echo $m->a;
//prints A

//2
//echo $m->a;
//echo $m->b;
//prints Ab, B

//3
//echo $m->a.",," . $m->b; 
//prints b,A,,B

番号3の動作を理解できません。誰かが説明できれば、この動作のどこにも答えが見つからないため、非常に感謝しています。

アクセス修飾子とプロパティの可視性は理解していますが、保護されたプロパティを呼び出すゲッターが許可されているため、「b」が最初に印刷される理由がわからないため、いくつかのギャップが必要です。

さらに、「A」が最初に印刷されると思っていました(1と2のように)。
'a' と 'b' の両方を同時にエコーすると、なぜ動作が異なるのか不思議に思います。

私が考えることができる唯一のことはecho
、 - コンマバージョンでは、各引数が評価され、順番にエコーされます
- ドットバージョンは異なります。要求どおりにエコーする前に、完全に評価する必要があります。
しかし、よくわかりません(どのように評価されますか?)。

ありがとう

4

2 に答える 2

2

それはechoin__getメソッドによるものです。最初に呼び出すとecho $m->a.",," . $m->b;、ステートメント内の関数が呼び出されます。したがって、echoin__getが最初に呼び出されます。

于 2013-03-08T12:23:26.390 に答える
1

これは、言うまでもなく PHP OOP とは何の関係もありませんが、オペランドの評価順序とは関係ありません。

echo ($m->a . ",," . $m->b);

3 つのオペランドの連結です。

  • $m->a : それ自体は"A"を返します
  • ,,: ",," を返します(当然)
  • $m->b は、$m->__get('b') を呼び出すことで 2 つのことを行います: 最初に(ゲッター関数自体で) "b,"をエコーし​​、次に連結のために "B" を返します。

したがって、3 つのオペランドが 1 つの文字列 "A,,B" に連結されるまでに、プログラムは既に "b," をエコーし​​ます。次に、連結された文字列が出力のために YOUR コマンド echo に渡されるため、最終結果は "b,A,,B" になります。

于 2013-03-08T12:24:40.040 に答える