サーチ…
構文
-
$foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
-
$var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;
備考
参照によって2つの変数を割り当てている間、両方の変数は同じ値を指しています。次の例を考えてみましょう。
$foo = 1;
$bar = &$foo;
$foo
は $bar
指しません 。 $foo
と$bar
の同じ値に両方のポイントを$foo
ある、 1
。説明する:
$baz = &$bar;
unset($bar);
$baz++;
関係にpoints to
あれば、これはunset()
後に今すぐunset()
ます。代わりに、 $foo
と$baz
は同じ値( 2
)を指しています。
参照による割り当て
これは参照の第1段階です。本質的には、参照によって割り当てるときに、2つの変数が同じ値を共有できるようにしています。
$foo = &$bar;
$foo
と$bar
は等しいです。彼らはお互いを指差していません 。彼らは同じ場所( "値" )を指しています。
array()
言語構造内で参照によって割り当てることもできます。厳密には参照による割り当てではありません。
$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);
配列内の参照が潜在的に危険であることは、 注意してください 。右側の参照で通常の(参照ではなく)代入を行うと、左側が参照になりませんが、配列内の参照はこれらの通常の代入で保持されます。これは配列が値渡しされる関数呼び出しにも当てはまります。
参照による代入は、変数と配列に限定されているだけでなく、関数とすべての "参照渡し"の関連付けにも使用されます。
function incrementArray(&$arr) {
foreach ($arr as &$val) {
$val++;
}
}
function &getArray() {
static $arr = [1, 2, 3];
return $arr;
}
incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]
代入は、上記の関数定義内のキーです。式を参照渡しすることはできず 、値/変数のみを渡すことはできません 。したがって、 bar()
内の$a
のインスタンス化。
参照渡し
場合によっては、暗黙のうちに参照渡しする時間があります。
参照渡しは、参照をバインドする変数を見つけるために関数を使用する場合に便利です。パフォーマンスを向上させるためにリターン・バイ・リファレンスを使用しないでください。エンジンはそれを自動的に最適化します。有効な技術的理由がある場合にのみ参照を返します。
参照で返すためのPHPドキュメンテーションから取られます。
以下の例を含めて、参照によって取れる多くの異なる形式があります。
function parent(&$var) {
echo $var;
$var = "updated";
}
function &child() {
static $a = "test";
return $a;
}
parent(child()); // returns "test"
parent(child()); // returns "updated"
参考文献は、関数参照に限定されているだけではありません。暗黙的に関数を呼び出すこともできます:
function &myFunction() {
static $a = 'foo';
return $a;
}
$bar = &myFunction();
$bar = "updated"
echo myFunction();
関数呼び出しを直接参照することはできません。関数呼び出しを利用する前に変数に代入する必要があります。その動作を確認するには、単にecho &myFunction();
試してみてくださいecho &myFunction();
。
ノート
- それを使用する予定の両方の場所で参照(
&
)を指定する必要があります。これは、関数の定義(function &myFunction() {...
)および呼び出し参照(function callFunction(&$variable) {...
または&myFunction();
)を&myFunction();
。 - 変数は参照のみで返すことができます。したがって、上記の例で
$a
のインスタンス化。これは、式を返すことができないことを意味します。そうでなければ、E_NOTICE
PHPエラーが生成されます(Notice: Only variable references should be returned by reference in ......
)。 - 参考までに返されるのは正当なユースケースですが、同じ目標を達成するための他のすべての可能性のあるオプションを検討した後に限り、それらを控えめに使用するよう警告する必要があります。
参照渡し
これにより、元の変数を変更できる関数または要素への参照によって変数を渡すことができます。
参照渡しは変数だけに限定されるものではありませんが、以下を参照渡しすることもできます。
- 新しい文、例えば
foo(new SomeClass)
- 関数から返された参照
配列
「参照渡し」の一般的な使い方は、配列内の初期値を変更することです。新しい配列を作成したり、名前空間を散らばすことはありません。通過バイ参照すると、変数を付ける/前のように単純である&
=> &$myElement
。
以下は、配列から要素を利用し、その初期値に1を加えるだけの例です。
$arr = array(1, 2, 3, 4, 5);
foreach($arr as &$num) {
$num++;
}
$arr
内の要素を利用すると、元の要素は参照が増加したときに更新されます。次の方法でこれを確認できます:
print_r($arr);
注意
ループ内で参照によって渡すときに注意する必要があります。上記のループの最後では、
$num
まだ配列の最後の要素への参照を保持しています。それをポストループに割り当てることは、最後の配列要素を操作することになります!ポストループをunset()
することでこれが起こらないようにすることができます:$myArray = array(1, 2, 3, 4, 5); foreach($myArray as &$num) { $num++; } unset($num);
上記はあなたが問題に遭遇しないようにします。この問題に関連する問題の例がStackOverflowにあります。
関数
参照渡しのもう1つの一般的な使用法は、関数内にあります。元の変数を変更するのは簡単です:
$var = 5;
// define
function add(&$var) {
$var++;
}
// call
add($var);
元の変数をecho
することで検証できます。
echo $var;
関数に関するさまざまな制限があります(下記のPHPドキュメントを参照)。
注:関数呼び出しには参照符号はありません。関数定義についてのみです。関数の定義だけで、引数を正しく参照することができます。 PHP 5.3.0以降では、&in foo(&$ a);を使用すると「参照渡し時の呼び出し時間」が廃止されるという警告が表示されます。また、PHP 5.4.0以降では、参照渡しの呼び出し時間が削除されたため、致命的なエラーが発生します。