PHP リファレンス (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加します)
PHP におけるリファレンスとは、異なる名前が同じ変数の内容にアクセスすることを意味します。
変数リファレンス
PHP リファレンス を可能にします。 2 つの変数を使用して同じコンテンツを指すようにするには
例 1:
$a="2010";
$b =&$a;
echo $a;//ここに出力します: 2010
echo $b;//ここに出力: 2010
$b="2012";
echo $a;//ここでの $a の値は 2012 に変更されるため、出力は
echo $b;//ここでは 2012 を出力します
?>
例 2:
$a = "date";
$b = &$a;
echo $a; // date
echo $ b ; // date
$b = "date1";
echo $a; // date1
unset($a);
echo $b;
?> 上記 2 つの例から、$b のメモリ アドレスを $b に与えるのは単純な代入ではないことがわかります。したがって、$bに対する操作は$aにも影響します別の言い方は、$aにエイリアス$bを追加することです。$aが削除されると、変数の名前だけが削除されますが、変数は削除されます。この変数の内容は、エイリアスを使用して引き続き表示できます。 (図に示すように) アドレスによる関数呼び出し 例 3: function test(&$a){$a=$a+100; } $b=1;echo $b;//出力1//$bが関数に渡すのは、実際には$bの値を変更することにより、$bの変数内容が配置されているメモリアドレスです。関数内の a $btest($b); echo $b;//出力 101?> ここで test(1); とするとエラーになります。 説明 パラメータは変数のみにすることができ、定数にはアドレスを渡すことができません。 関数参照 return 関数参照 return は主にオブジェクトで使用されます。わかりやすいように静的変数を使用する例を示します。例 4: function &test(){static $b=0;//静的変数を宣言します $b=$b+1; echo $b; return $b;}// このステートメントは $ の値を出力しますb は 1$a=test();$a=5;$a=test();//このステートメントは $b の値を 2 として出力します $a=&test( ) ;//このステートメントは $b の値を 3 として出力します$a=5;$a=test();//このステートメントは $b の値を 6 として出力しますコメント、この関数is 出力があり、戻り値もあります。 $a = test(); これは関数 test の戻り値 $b を $a に代入するだけであり、関数からの参照戻りではありません。したがって、$a がどのような操作を行っても、$b には影響しません。 $a = &test(); この関数は、$b のメモリ アドレスと $a のメモリ アドレスを同じ場所にポイントすることで、$b = &$a の値と同様の効果が得られます。 $aが変化し、5になっても$bの値にも影響します。 $a = &test(); $a = 5 を実行すると、$b = 5 があり、関数の処理後に $b = 6 が出力されます オブジェクトの参照5: class a{var $abc="ABC";}$b=new a;$c=$b;echo $b-> abc;// ここに ABC を出力echo $c->abc;// ここに ABC を出力$b->abc="DEF";echo $c->abc;// ここに DEF を出力?> ; 上記のコードは、PHP5 で実行した結果です。PHP5 では、オブジェクトのコピーは参照を通じて行われます。 $b=new a; $c=$b; 上の列は、実際には $b=new a; $c=&$b; と同等です PHP5 のデフォルトでは、オブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望む場合があります。このような目的のために、PHP では __clone と呼ばれる特別なメソッドが定義されています。 参照の役割 プログラムが比較的大きく、同じオブジェクトを参照する変数が多数あり、オブジェクトを使用した後に手動でクリアしたい場合は、「&」メソッドを使用することをお勧めします。次に $var=null を使用してそれをクリアします。それ以外の場合は、php5 のデフォルトのメソッドを使用してください。 さらに、php5で大きな配列を転送する場合は、メモリスペースを節約できるため、「&」メソッドを使用することをお勧めします。 参照解除 参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。 例: $a = 1;$b =& $a;unset ($a);?> は$bの設定を解除しません。 。 変数参照セクションを参照してください グローバル参照 global $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。 これは次のコードと同等です: $var =& $GLOBALS["var"];?> これは、たとえば、unset $var は unset されないことを意味します。グローバル変数。 $this オブジェクトのメソッドにおいて、$this は常にそれを呼び出すオブジェクトへの参照です。 追加手順
PHP におけるアドレスのポインティング (ポインタに似た) 関数はユーザー自身によって実装されるのではなく、Zend コアによって実装されます。PHP における参照は「コピー オン ライト」の原則を採用しています。書き込み操作が発生しない限りコピーされません。他の操作では、同じアドレスを指す変数やオブジェクトはコピーされません。
次のコードがあるとします:
$a="ABC";
$b=$a;
追記: $a と $b が指すように $b = &$a にするべきだと個人的には思います。同じメモリアドレスですが、これは私が参照した情報の内容です。現時点では、私は & についてあまり知りません。もし他の意見がある場合は、ありがとうございます
。 $a と $b が異なるメモリを占有するのではなく、両方とも同じメモリ アドレスを指します
上記のコードに追加すると、次のコードになります
$a="EFG";
"操作
$a と $b が指すメモリ内のデータを書き換える必要があるため、この時点で Zend コアが自動的に判断し、$a の $b 用のデータ コピーを自動的に生成し、再書き込みします。ストレージ用のメモリを申請します。