2

私はプロジェクト開発のためにクラスベースのコーディングに従っています.最近、関数名の前に「&」を付けることがあるのを見ました..

例として..

定義するのではなく

function test()

それは次のように定義されています

function &test()

「&」に特別な意味はありますか?

4

3 に答える 3

4

@philipが言及しているように、参照を返すことです

上記のリンクから:

注: パラメーターの受け渡しとは異なり、ここでは & を両方の場所で使用する必要があります。これは、コピーではなく参照によって返すことを示し、通常の代入ではなく参照バインディングを $myValue に対して行う必要があることを示します。


PHP はすべての変数をZVALコンテナーに格納します。

上記のリンクから:

zval コンテナーには、変数の型と値に加えて、2 つの追加ビットの情報が含まれます。1 つ目は「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 

関数は参照によって戻りますが、参照は戻り値の zval コンテナーに対するものです。ここで、返された値を代入しようとすると (&代入で a なしで言うと)、「refcount」だけが増加します。「is_ref」は変更されません。「戻り値が格納される変数」を変更しようとすると、COW (書き込み時のコピー)が発生し、新しい zval コンテナーが作成され、参照による戻り値が役に立たなくなります。&したがって、戻り値の代入にも atを追加する必要があります。

&戻り値の割り当てでは、次のことを考慮してください。

$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 
于 2011-12-29T07:16:45.047 に答える
2

参照渡しして参照返す

于 2011-12-29T06:01:02.493 に答える
1

これは、関数が変数への参照を返すことを意味します。ここで詳細を読むことができます: http://php.net/manual/en/language.references.php

于 2011-12-29T06:01:52.077 に答える