出典: http://hi.baidu.com/bing2liuliu/blog/item/3e115bfb1bc726995bee9063.html
PHP 参照 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加します)
PHP での参照とは、異なる名前が同じ変数の内容にアクセスすることを意味します
C 言語のポインターとは異なります。 C言語のポインタは、変数の内容のアドレスをメモリに保存します
変数リファレンス
PHPのリファレンスでは、2つの変数を使用して同じ内容を指すことができます
$a="ABC ";
$b =&$a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG";
echo $a;//ここに出力 $a 値は EFG になります、EFG は出力です
echo $b;//ここに EFG を出力します
?>
アドレスによる関数呼び出し
アドレスによる呼び出しについては詳しく説明しません
function test( &$a)
{
$a=$a+100;
}
$b=1;
echo $b;//出力 1
test($b); //ここで $b が関数に渡されるもの実際には、$b の変数の内容が配置されているメモリ アドレスです。関数
echo "
";
echo $b;//output で $a の値を変更することで、$b の値を変更できます。 101
注意してください、はい、ここでtest(1);するとエラーが発生します
関数の参照戻り
まずコードを見てください
function &test()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
echo $b;
return $b;
}
$a=test();//このステートメントは次の値を出力します$b as 1
$a=5;
$a=test();//このステートメントは $b の値を 2 として出力します
$a=&test();//このステートメントは $ の値を出力しますb as 3
$a=5;
$ a=test();//このステートメントは $b の値を 6 として出力します
以下の説明:
このように、$a=test();通常と異なる関数の参照戻り値を取得する 理由としては、PHP の規定で関数の参照戻り値を $a=&test で取得することが規定されているためです。 (); 参照戻りとは何ですか (PHP マニュアルには、参照をバインドする必要がある変数を見つけるために関数を使用する場合に参照戻りが使用されると書かれています)。このナンセンスは私には理解できませんでした。上の例を使って説明すると、$a=test() を使用して関数を呼び出すことになります。これは、値が $a に代入されるだけであり、$a への変更は影響しません。 $a=&test() を通じて関数を呼び出すと、その関数は変数のメモリ アドレスと $a 変数のメモリ アドレスが同じ場所を指します。これにより、同等の効果が得られます ($a=&b;)。したがって、$a の値を変更すると、$b の値も変更されるため、
$a=&test();
$a=5;
その後、値が変更されます。 $b の値は 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 の大きな配列の場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。
参照解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:
$a = 1;
$b =& $a;
unset ($a);
?>
は$bの設定を解除せず、$aのみを設定解除します。
グローバル参照
global $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、次の操作と同じです:
$var =& $GLOBALS["var"];
?>
これは、たとえば、unset $var はグローバル変数の設定を解除しないことを意味します。
$this
オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照です。
//ここでまたちょっとしたエピソードです
PHP におけるアドレスのポインティング (ポインタに似た) 関数は、ユーザー自身によって実装されるのではなく、Zend コアによって実装されます。PHP における参照は、「コピー」の原則を採用しています。 on-write" 、つまり、書き込み操作が発生しない限り、同じアドレスを指す変数またはオブジェクトはコピーされません。
平たく言えば
1: 次のコードがあるとします
$a="ABC";
$b=$a;
実際、この時点では $a と $b は両方とも同じメモリ アドレスを指しており、$a と $b は同じメモリ アドレスを指しているわけではありません。 $b は別の場所を占有します
2: 上記のコードに次のコードを追加すると
$a="EFG";
$a と $b が指すメモリ内のデータが書き換えられるので、この時点で、Zend コアは $b に対する $a のデータ コピーを自動的に決定して生成し、ストレージ用のメモリを再申請します