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



phpの参照(変数または
関数、オブジェクトなどの前に&記号を付ける)
にある
PHPでは、異なる名前が同じ変数の内容にアクセスすることを意味する.
C言語のポインタとは異なる.C言語のポインタには変数の内容がメモリに格納されているアドレスが格納されている
変数の参照
PHPの参照では、2つの変数で同じ内容を指すことができます.
PHPコンテンツをクリップボードにコピー
PHPコード:
<?
$a
="ABC";
$b =&$a;
echo 
$a;// :ABC
echo $b;// :ABC
$b="EFG";
echo 
$a;// $a EFG  EFG
echo $b;// EFG
?>


関数のアドレスコール
アドレス呼び出しはあまり言わないで、次は直接コードを与えます.
PHPコンテンツをクリップボードにコピー
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コンテンツをクリップボードにコピー
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コンテンツをクリップボードにコピー
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が参照すると、変数名と変数コンテンツのバインドが解除されます.これは、変数の内容が破棄されたという意味ではありません.例:
$a = 1;
$b =& $a;
unset ($a);
?>  
unset$bはありません.$aだけです.
Globalリファレンス
global$varで変数を宣言すると、実際にグローバル変数への参照が確立されます.つまり、このようにするのと同じです.
$var =& $GLOBALS["var"];
?>  
これは、たとえばunset$varがunsetグローバル変数をunsetしないことを意味します.
$this
1つのオブジェクトのメソッドでは、$thisは常にそのオブジェクトを呼び出す参照です.
//次はエピソード
phpにおけるアドレスの指向(類似ポインタ)機能は,ユーザ自身が実現するものではなく,
Zendコアは、phpで引用される「書き込み時コピー」の原理を採用しており、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされない.
通俗的に言う
1:次のコードがあれば
PHPコンテンツをクリップボードにコピー
PHPコード:$a="ABC";
$b=$a;


実際には、$aと$bは同じメモリアドレスを指しており、$aと$bが異なるメモリを占有しているわけではありません.
2:上のコードに次のコードを加えると
PHPコンテンツをクリップボードにコピー
PHPコード:$a="EFG";


$aと$bが指すメモリの
データを書き直すと、Zendコアは自動的に$bで$aのデータコピーを生産し、メモリを再申請して記憶すると判断します.