2011-12-29 3 views

答えて

4

を@philipは述べているように、それはreturn a referenceへ:

注:パラメータの受け渡しとは異なり、ここであなたがする必要がある上記のリンクから

&を両方の場所で使用します。コピーではなく参照渡しを希望し、通常の割り当てではなく参照バインディングが$ myValueに対して行われるように指定します。


PHP格納ZVALコンテナ内のすべての変数。

上記リンクから:

zvalを容器は変数の型と値のほか、information.Theの二つの追加ビットが最初「is_ref」と呼ばれるかどうかを示すブール値である、含ま変数は「参照セット」の一部です。このビットでPHPのエンジンは、通常の変数と参照を区別する方法を知っています。 PHPは&演算子で作成されたユーザランド参照を許可するため、zvalコンテナにはメモリ使用を最適化するための内部参照カウント機構もあります。 "refcount"と呼ばれるこの2番目の追加情報には、この1つのzvalコンテナを指す変数名(シンボルとも呼ばれます)の数が含まれています。


は、出力変数の値を確認します
戻り値の割り当てに&ずに次のことを考慮してください

$b=0; 
function &func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a = func("myname");// no & at assignment 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/>"; 

上記コードの出力:

$a= 11 $b= 10 
a: (refcount=1, is_ref=0)=11 

関数は参照によって返されますが、参照はret urned値のzvalコンテナさて、戻り値を代入しようとすると(代入時に&がなくても)、「refcount」だけが増加します。どこで "is_ref"が変更されないか。戻り値が格納されている変数が変更しようとすると、C.O.W (copy on write)が発生し、新しいzvalコンテナが作成され、参照による戻り値は役に立たなくなります。したがって、戻り値の代入時に&を追加する必要があります。

は、戻り値の代入で&で次の点を考慮

$b=0; 
function &func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a =& func("myname");// & at assignment 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/>"; 

出力:

$a= 11 $b= 11 
a: (refcount=2, is_ref=1)=11 
2
+0

機能がこの 関数fooのように定義されているという点で、私は(..あなたのリンクをチェックしています&$ bar){} 私はなぜ変数の前に関数の前に "&"をつけているのかを尋ねています。 –

+0

私は両方のリンクがあなたのために説明するかもしれないと思っていました。私たちのクエリ – Philip

+1

これは、foo(&$ bar){}では参照で変数を渡し、&foo($ bar)では参照で何かを返すからです。 –

関連する問題