PHP での引用とは、異なる名前が同じ変数の内容にアクセスすることを意味します。
C言語のポインタとは異なります。 C言語のポインタは変数の内容がメモリ上に格納されるアドレスを格納します
変数参照
PHP 参照を使用すると、2 つの変数を使用して同じコンテンツを指すことができます
[php]
$a="ABC";
$b =&$a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG";
echo $a;//ここでの$aの値がEFGになるのでEFGが出力されます
echo $b;//ここにEFGを出力します
?>
[/php]
アドレスによる関数呼び出し
アドレスによる呼び出しについては詳しく説明しません。コードはすぐ下にあります
。
[php]
機能テスト(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//出力 1
test($b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリ アドレスです。関数内の $a の値を変更することで、$b の値を変更できます。変わりました
エコー「
」
";
echo $b;//出力 101
[/php]
ここでtest(1);を使用するとエラーが発生するので注意してください
関数参照が返されます
まずはコードを見てみましょう
[php]
関数&test()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
エコー $b;
$b を返します;
}
$a=test();//このステートメントは、$b の値が 1 であることを出力します
$a=5;
$a=test();//このステートメントは、$b の値が 2 であることを出力します
$a=&test();//このステートメントは、$b の値が 3 であることを出力します
$a=5;
$a=test();//このステートメントは、$b の値が 6 であることを出力します
[/php]
以下で説明します:
このように、$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になります
ここで静的変数を使用するのは、関数の参照戻り値を誰もが理解できるようにするためです。実際、関数の参照戻り値は主にオブジェクトで使用されます
。
オブジェクトリファレンス
[php]
クラスA{
var $abc="ABC";
}
$b=新しいa;
$c=$b;
echo $b->abc;//ここにABCを出力します
echo $c->abc;//ここにABCを出力します
$b->abc="DEF";
echo $c->abc;//ここにDEFを出力します
?>
[/php]
上記のコードはPHP5での実行エフェクトです
PHP5 では、オブジェクトのコピーは参照を通じて行われます。上の列では、 $b=new a; $c=$b; は $b=&$b; と同等です。
PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義しています。
引用符の役割
プログラムが比較的大きく、同じオブジェクトを参照する変数が多数あり、使用後にオブジェクトを手動でクリアしたい場合は、個人的には「&」メソッドを使用し、それ以外の場合は $var=null を使用してオブジェクトをクリアすることをお勧めします。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。
引用を解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:
$a = 1;
$b =& $a;
設定を解除 ($a);
?>
$b の設定は解除されず、$a のみが解除されます。
世界的な引用
global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それはこれを行うのと同じです:
$var =& $GLOBALS["var"];
?>
これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。
$これ
オブジェクト メソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。
//以下にちょっとした間奏
PHP のアドレス ポインティング (ポインタに似た) 関数は、ユーザー自身によって実装されるのではなく、Zend コアによって実装されます。PHP の参照は、書き込みが行われない限り、コピーオンライトの原則を採用しています。操作が発生した場合、同じアドレスを指す変数またはオブジェクトはコピーされません。
平たく言えば
1: 次のコードがある場合
[php]
$a="ABC";
$b=$a;
[/php]
実際、この時点では、$a と $b が異なるメモリを占有するのではなく、両方とも同じメモリ アドレスを指します
2:上記のコードに以下のコードを追加すると
[php]
$a="EFG";
[/php]
$a と $b が指すメモリ内のデータは書き換える必要があるため、Zend コアはこの時点で自動的に判断し、$b 用の $a のデータ コピーを自動的に作成し、$b 用のメモリを再申請します。ストレージ