私はプロジェクト開発のためにクラスベースのコーディングに従っています.最近、関数名の前に「&」を付けることがあるのを見ました..
例として..
定義するのではなく
function test()
それは次のように定義されています
function &test()
「&」に特別な意味はありますか?
私はプロジェクト開発のためにクラスベースのコーディングに従っています.最近、関数名の前に「&」を付けることがあるのを見ました..
例として..
定義するのではなく
function test()
それは次のように定義されています
function &test()
「&」に特別な意味はありますか?
@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
これは、関数が変数への参照を返すことを意味します。ここで詳細を読むことができます: http://php.net/manual/en/language.references.php