ホームページ  >  記事  >  バックエンド開発  >  php_PHPチュートリアルのリファレンス(&シンボル)の役割を詳しく解説

php_PHPチュートリアルのリファレンス(&シンボル)の役割を詳しく解説

WBOY
WBOYオリジナル
2016-07-21 14:55:47859ブラウズ

PHP 参照 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加します)

PHP での参照とは、異なる名前が同じ変数の内容にアクセスすることを意味します
C 言語のポインターとは異なります。 C言語のポインタは、変数の内容がメモリ上に格納されているアドレスを格納します

変数の参照

PHPの参照では、2つの変数を使用して同じ内容を指すことができます

$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;//出力 1
test($b);関数に渡されます $ b の変数の内容が格納されているメモリ アドレス。
echo "
"; の $a の値を変更することで、$b の値を変更できます。 //出力101

注意点 はい、ここでtest(1)を使うとエラーになります

関数の参照戻り
まずはコードを見てください

function &test();
{
static $b=0;//静的変数を宣言します
$b=$b+1;
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 の規定で関数の参照を取得することが規定されているためです。 $a=&test();. 参照リターンとは何かについては(PHPマニュアルには、参照がバインドされるべき変数を見つけるために関数を使用するときに使用されます。)このナンセンスは私を驚かせました。上の例で説明すると、
$a=test() という方法で関数を呼び出し、単に $a に値を代入するだけです。そして、$a への変更は、関数内の $b には影響しません
そして、$a=&test() を通じて関数を呼び出すと、その関数は、$b 内の $b 変数を返すことになります。メモリ アドレスと $ のメモリ アドレス同じ場所を指す変数
、これと同等の効果を生成します ($a=&b;) したがって、$a の値を変更すると $b の値も変更されるため、実行後は
$a=&test(); $a=5;
その後、$b の値は 5 になります

これは、静的変数を使用する前に関数の参照戻り値を理解してもらうためです。実際、関数の参照戻り値はオブジェクトで使用されることがほとんどです。

オブジェクトの参照

var $abc="ABC";
$b=new a;
echo $b->abc;//ここに ABC を出力
echo $c->abc;//ここに ABC を出力
$b->abc="DEF";//ここに DEF を出力

;このコードは PHP5 の実行エフェクトです
PHP5 では、オブジェクトのコピーは参照を通じて行われます。上記の列の $b=new a; $c=$b; は、実際には $b=new a; $c=&$b; と同等ですが、場合によってはオブジェクトを参照します。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望みます。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義します。プログラムが比較的大きい場合は、同じオブジェクトを参照する 多くの変数があり、使用後にオブジェクトを手動でクリアしたい場合は、「&」メソッドを使用し、それ以外の場合は $var=null を使用することをお勧めします。また、php5 の大きな配列の場合は、メモリ領域を節約できるため、「&」メソッドを使用して転送することをお勧めします。

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

$a = 1;
$b =& $a;

は $b の設定を解除しません。

グローバル参照
global $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、

$var =& $GLOBALS["var"];
?>

これは、たとえば、unset $var はグローバル変数の設定を解除しないことを意味します。

$this
オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照です。

//ここでまたちょっとしたエピソードです
​​ PHP におけるアドレスのポインティング (ポインタに似た) 関数は、ユーザー自身が実装するのではなく、Zend コアによって実装されます。PHP の参照は「コピーオン」の原則を採用しています。 -write"。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数またはオブジェクトはコピーされません。

平たく言えば
1: 次のコードがある場合

$a="ABC";
$b=$a;

実際、この時点では、$a と $b は両方とも同じメモリ アドレスを指します。 $b は異なる領域を占有します

2: 上記のコードに次のコードを追加すると

$a と $b が指すメモリ内のデータを書き換える必要があるため、この時点で、Zend コアは $b に対する $a のデータ コピーを自動的に決定して自動的に生成し、ストレージ用のメモリを再申請します。

http://www.bkjia.com/PHPjc/364363.html

tru​​ehttp://www.bkjia.com/PHPjc/364363.html技術記事 PHP での参照 (つまり、変数、関数、オブジェクトなどの前にシンボルを追加すること) は、異なる名前が同じ変数の内容にアクセスすることを意味します。C 言語のポインターとは異なります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。