PHP における参照の意味は、異なる名前が同じ変数の内容にアクセスすることです。
は C 言語のポインタとは異なります。 C 言語のポインタは、変数の内容のアドレスをメモリに保存します
変数参照
PHP の参照では、2 つの変数を使用して同じ内容を指すことができます
コードをコピー コードは次のとおりです:
<
$a="ABC";
$b =&$ a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG"; //ここに $a 値EFG になるので、EFG を出力
echo $b;//ここに EFG を出力
コードをコピーします。 コードは次のとおりです。 > 関数 test(&$ a) {
$a=$a 100;}
echo $b;//出力 1
test($b); // ここで $b が関数に渡すのは、実際には $b の変数の内容が配置されているメモリ アドレスです。関数内の $a の値を変更することで、$b の値を変更できます。 updated
echo "
";
echo $b;//Output 101
ここで test(1); を使用するとエラーが発生することに注意してください。
関数の参照
function &test() { static $b=0;//静的変数を宣言します
$b=$b 1;echo $b;
return $b;
}
$a=test() ;//このステートメントは $b の値を 1
$a=5; として出力します。 🎜>$a=test();//このステートメントは $b の値を 2 として出力します
$a =&test();//このステートメントは $b の値を 3 として出力します
$a =5;
$a=test();//このステートメントは $b の値を 6 として出力します
以下の説明:
このように $a=test() ; 得られるものは実際には関数参照の戻り値ではなく、通常の関数呼び出しと何ら変わりません: これは PHP の規則です
PHP では、関数の参照戻り値は $a=&test を通じて取得されると規定されています。 ();
参照リターンとは何かについては、PHP マニュアルに次のように書かれています。参照リターンは、関数を使用して参照を見つけたい場合に使用されます。それは、どの変数にバインドするときである必要があります。 ) 私は長い間このナンセンスを理解できませんでした
上の例を使って説明すると、
クラス a{ var $abc="ABC"; $c=$b; 🎜>echo $b->abc;//ここに ABC を出力
echo $c->abc;//ここに ABC を出力$b->abc="DEF"; c->abc;//ここに DEF を出力します
?>
上記のコードは PHP5 での実行結果です
PHP5 では、オブジェクトのコピーは参照によって実現されます。上記の列では、 $b=new a; $c=$b; は $b=new a;
のデフォルトではオブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合、PHP では、
参照の役割
< と呼ばれる特別なメソッドを定義します。 🎜 >プログラムが比較的大きく、同じオブジェクトを参照する変数がたくさんあり、使用後にオブジェクトを手動でクリアしたい場合は、個人的には "&" メソッドを使用し、その後 $var=null を使用してオブジェクトをクリアすることをお勧めしますまた、php5 で大きな配列を転送する場合は、メモリ容量を節約できるため、「&」メソッドを使用することをお勧めします。
参照解除
?> コードをコピーします コードは次のとおりです。
$b の設定は解除されず、$a のみが解除されます。
グローバル参照
グローバル $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。つまり、これは次の操作と同じです。
< ?php
$ var =& $GLOBALS["var"];
?>
これは、たとえば、unset $var はグローバル変数の設定を解除しないことを意味します。
$this
オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照になります。
//ここでまたちょっとしたエピソードです
PHP のアドレスのポインティング (ポインタに似た) 関数はユーザー自身によって実装されるのではなく、Zend コアによって実装されます。PHP の参照は " を使用します。 write 「タイムコピー」の原理は、書き込み操作が発生しない限り、同じアドレスを指す変数またはオブジェクトはコピーされないということです。
簡単に言えば
1: 次のコードがあるとします。
$a="ABC";
$b=$a;
実際には、$a と $b は両方とも次のことを指します。このときのメモリアドレスは $a と $b が別のメモリを占有するわけではありません
2: 上記コードに次のコードを追加すると
$a="EFG"; なぜなら $a と $b は異なるメモリを占有します。 a と $b 指定されたメモリ内のデータは書き換える必要があります。この時点で、Zend コアは $a の $b 用のデータ コピーを自動的に作成し、ストレージ用のメモリを再申請します。