Looking for php Keywords? Try Ask4Keywords

PHP 参照渡し


これにより、元の変数を変更できる関数または要素への参照によって変数を渡すことができます。

参照渡しは変数だけに限定されるものではありませんが、以下を参照渡しすることもできます。

  • 新しい文、例えば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以降では、参照渡しの呼び出し時間が削除されたため、致命的なエラーが発生します。