phpリファレンス(&)詳細レコード


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を出力
?>
関数のアドレスコール
アドレス呼び出しはあまり言わないで、次は直接コードを与えます.
 
<?php
function test(&$a) 
{ 
$a=$a+100; 
} 
$b=1; 
echo $b;//  1 
test($b);   //  $b         $b            ,        $a        $b    
echo "<br>"; 
echo $b;//  101
?>

ここでtest(1);間違ってしまう
関数の参照が返されます
まずコードを見て
 
<?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();得られたのは実は関数の引用が返すのではありませんて、これは普通の関数の呼び出しと区別がありません原因:これはPHPの規定です
PHP規定は$a=&test();メソッドが得られるのが関数の参照戻りです
リファレンスリターンとは何か(PHPマニュアルでは、リファレンスリターンは、関数でリファレンスがどの変数にバインドされるべきかを見つけたい場合に使用されます.)このおべっかを使った言葉は私に長いこと理解できなかった.
上の例で説明すると
$a=test()方式で関数を呼び出し、関数の値を$aに割り当てるだけで、$aが変更されても関数の$bに影響しません.
$a=&test()方式で関数を呼び出すのは、return$bの$b変数のメモリアドレスと$a変数のメモリアドレスを同じ場所に指す役割を果たす.
すなわち、このような効果に相当する($a=&b;)従って$aの値を変更するとともに$bの値を変更するので実行する
$a=&test();
$a=5;
以降、$bの値は5になる
ここでは、関数の参照戻りを理解するために静的変数を使用しますが、関数の参照戻りはオブジェクトで多く使用されます.
オブジェクトの参照
 
<?php
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 
?> 

以上のコードはPHP 5での実行効果です
PHP 5におけるオブジェクトの複製は参照によって実現される.上の列の$b=new a;$c=$b; 実は$b=new aに等しい.c=&$b;
PHP 5では、デフォルトでは参照によってオブジェクトが呼び出されますが、オブジェクトのコピーを作成し、元のオブジェクトの変更がコピーに影響しないようにしたい場合があります.このような目的のために、PHPは__という特殊な方法を定義した.clone.
参照の役割
プログラムが大きい場合は、同じオブジェクトを参照する変数が多く、そのオブジェクトを使い切った後に手動でクリアしたい場合は、個人的には「&」でクリアし、$var=nullでクリアすることをお勧めします.他の時はphp 5のデフォルト方式を使いましょう.また、php 5では大きな配列の伝達については、メモリスペースを節約して使用する「&」方式が推奨されています.
参照解除
unsetが参照すると、変数名と変数コンテンツのバインドが解除されます.これは、変数の内容が破棄されたという意味ではありません.例:

<?php 
$a = 1; 
$b =& $a; 
unset ($a); 
?>  

unset$bはありません.$aだけです.
Globalリファレンス
global$varで変数を宣言すると、実際にグローバル変数への参照が確立されます.つまり、このようにするのと同じです.

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

これは、たとえばunset$varがunsetグローバル変数をunsetしないことを意味します.
$this
1つのオブジェクトのメソッドでは、$thisは常にそのオブジェクトを呼び出す参照です.
//次はエピソード
phpにおけるアドレスの指向(ポインタ類似)機能はユーザ自身で実現されるものではなくZendコアで実現されるものであり、phpにおける参照は「書き込み時コピー」の原理を採用している.つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされない.
通俗的に言う
1:次のコードがあれば

<?php 
$a="ABC"; 
$b=$a;
?> 
[/php] 
     $a $b               $a $b        

2:                   

<?php 
$a="EFG";
?> 

$aと$bが すメモリのデータを き すため、Zendコアは に$bのために$aのデータコピーを すると し、メモリを して する