phpリファレンス(&)の詳しい説明
[size=small][color=darkred]
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的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101
。なお、ここで test(1 ; test(); は実際には関数参照を返しているわけではなく、通常の関数呼び出しと変わりません 理由としては、これは PHP の規定です
PHP では、関数参照は $a=&test(); によって取得されます。 Return
参照リターンとは何かについては、PHP マニュアルに次のように記載されています。 参照リターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用されます。 .) このナンセンスなため、私は長い間理解できませんでした。
上の例を使って説明すると、
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() は関数を呼び出し、関数の値を $a に代入するだけです。そして $a への変更は関数内の $ には影響しません。 b
$a=&test() を通じて関数を呼び出すと、その関数は $b とその戻り値として $b 変数のメモリ アドレスをポイントします。 $a 変数のメモリアドレスを同じ場所に変更します
つまり、同等の効果 ($a=&b;) があるため、$a の値を変更すると $b の値も変更されるため、$a=&test();
$a=5;
その後、$b の値は 5 になります
関数の参照戻りを誰もが理解できるように、ここでは静的変数が使用されています実際、関数の参照戻りは主にオブジェクトで使用されます
Objects Reference
上記のコードは PHP5 での実行効果です
PHP5 では、オブジェクトは参照を通じて実現されます。上記の列の $b=new a; $c=$b; は、実際には $b=new a; $c=&$b;
PHP5 のデフォルトではオブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義します。
参照の役割
。プログラムが比較的大きく、同じオブジェクトを参照する変数が多数あり、オブジェクトを使用した後に手動でクリアしたい場合は、「&」メソッドを使用し、その後 $var=null を使用してクリアすることをお勧めします。それ以外の場合は、 php5 のデフォルトのメソッドを使用します。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。
<?
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
?>
参照解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:
は $b の設定を解除せず、$a のみを設定解除します。
グローバル参照
グローバル $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、
<?php
$a = 1;
$b =& $a;
unset ($a);
?>
を実行するのと同じです。これは、たとえば、unset $var はグローバル変数の設定を解除しないことを意味します。
$this
オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照になります。
//ここでまたちょっとしたエピソードです
<?php
$var =& $GLOBALS["var"];
?>
php におけるアドレスのポインティング (ポインタに似た) 関数はユーザー自身が実装するのではなく、Zend コアによって実装され、参照されますin php これは「書き込み時コピー」の原則です。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。
わかりやすく言うと
1: 次のコードがあるとします。
実際、この時点では、$a と $b は、$a ではなく、同じメモリ アドレスを指します。と $b が異なるメモリを占有する
2: 上記のコードに次のコードを追加すると
$a と $b が指すメモリ内のデータは、書き換えられると、この時点で Zend コアは $a の $b 用のデータ コピーを自動的に決定して自動的に生成し、ストレージ [/color][/size] 用のメモリを再申請します。
$a="ABC";
$b=$a;