1

認定の練習をしているときに、MCQの質問に出くわしました。以下の通りでした。

Q:次のスクリプトを検討してください。何を出力しますか?

<?php
$global_obj = null;
class my_class
{
   var $value;
   function my_class()
   {
      global $global_obj;
      $global_obj = &$this;
   }
}
$a = new my_class;
$a->my_value = 5;
$global_obj->my_value = 10;
echo $a->my_value;
?>

正しい1つの オプションを選択します。

  • A. 5
  • B. 10
  • C.何もない
  • D.コンストラクターはエラーをスローします
  • E. 510

my_classコンストラクターで。$global_objの参照によって初期化されているため、B:10を選択しました$this。私がクロスチェックしたときまでに私の答えは間違っていました

説明として彼らはそれを述べました

これは本当にトリッキーなものです。最初の調査では、のコンストラクターは my_classそれ自体への参照を内に格納しているように見え$global_obj variableます。したがって、後で値$global_obj->my_valueを10に変更すると、$aの対応する値も変更されることが予想されます。残念ながら、new演算子は参照を返しませんが、新しく作成されたオブジェクトのコピーを返します。したがって、スクリプトは5を出力し、正解はAです。


Ya私は説明が十分であることに同意しますが$global_obj、$ thisの参照を明確に割り当てたため、それを消化することはできません。誰か詳しく説明してもらえますか?

4

2 に答える 2

6

$global_objに$thisの参照を明確に割り当てましたが、これはどのようにして可能になるのでしょうか。

コンストラクター内でグローバル変数を割り当てます。そのとき、あなたはある種の一時オブジェクトを参照しています。次に、コンストラクターはその一時オブジェクトのコピーを返します。これは、$ aが参照するコピーです(グローバル変数は引き続き一時オブジェクトを参照します)。

php4でOOPを実行するのは大変です。PHP 4のOOPの振る舞いを理解するべきではないと思いますが、それを受け入れるだけです...

于 2012-11-16T17:47:09.637 に答える
0

このスクリプトは「5」を出力します。これはAになり、次の警告が表示されます。警告:空の値からデフォルトオブジェクトを作成しています

これの理由はあなたがこれを設定するときです

                 `$global_obj = &$this;`

割り当ては現在のオブジェクトへの参照です

この記事は役立つかもしれません

http://www.webmaster-source.com/2010/02/25/why-do-some-php-variables-have-an-ampersand-before-them/

于 2012-11-16T18:19:24.913 に答える