ホームページ  >  記事  >  php教程  >  php引用(&)の詳しい説明

php引用(&)の詳しい説明

WBOY
WBOYオリジナル
2016-06-13 12:20:39860ブラウズ

PHP における参照の意味は、異なる名前が同じ変数の内容にアクセスすることです。
は C 言語のポインタとは異なります。 C 言語のポインタは、変数の内容のアドレスをメモリに保存します
変数参照
PHP の参照では、2 つの変数を使用して同じ内容を指すことができます

コードをコピー コードは次のとおりです:


<
$a="ABC";
$b =&$ a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG"; //ここに $a 値EFG になるので、EFG を出力
echo $b;//ここに EFG を出力


関数の参照渡し呼び出し
Passアドレス呼び出しについては多くは言いません。コードは次のとおりです。

コードをコピーします。 コードは次のとおりです。 > 関数 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=test() は関数を呼び出し、関数の値を $a に代入するだけです。 $a は何でも行います。変更は関数
内の $b には影響しません。関数が $a=&test() を通じて呼び出された場合、その関数は、$b が返される $b 変数のメモリ アドレスを、 $a 変数のメモリアドレス。同じ場所
を指すと同等の効果 ($a=&b;) が生成されるため、$a の値を変更すると $b の値も変更されるため、
$ を実行した後、 a=&test() ;
$a=5;
その後、$b の値は 5 になります
ここでは関数の参照戻りを理解するために静的変数を使用しています。関数の参照戻り値は主にオブジェクトで使用されます

オブジェクト参照




コードをコピー
コードは次のとおりです:

クラス 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 で大きな配列を転送する場合は、メモリ容量を節約できるため、「&」メソッドを使用することをお勧めします。


参照解除


参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:


コードをコピー
コードは次のとおりです。

$a = 1;
$ b =& $a;
設定を解除します

?>
$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 用のデータ コピーを自動的に作成し、ストレージ用のメモリを再申請します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。