参照渡し
関数がそのパラメータの値を変更できるように、参照によって変数を関数に渡すことができます。構文は次のとおりです。
<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>
関数呼び出しには参照記号はなく、関数定義のみにあることに注意してください。パラメーターを参照によって正しく渡すには、関数定義だけで十分です。 PHP の最近のバージョンでは、foo(&$a); で & を使用すると、「呼び出し時参照渡し」が廃止されたという警告が表示されます。
以下のものは参照によって渡すことができます:
foo($a) などの変数
foo(new foobar()) などの新しいステートメント
関数から返された参照、たとえば:
<?php function &bar() { $a = 5; return $a; } foo(bar()); ?>
その他式 どちらも参照渡しできず、結果は未定義です。たとえば、次の参照渡しの例は無効です:
<?php function bar() // Note the missing & { $a = 5; return $a; } foo(bar()); // 自 PHP 5.0.5 起导致致命错误 foo($a = 5) // 表达式,不是变量 foo(5) // 导致致命错误 ?>
これらの条件は、PHP 4.0.4 以降のバージョンで利用できます。
リファレンスリターン
リファレンスリターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用します。パフォーマンスを向上させるために戻り参照を使用しないでください。エンジンはそれ自体を最適化するのに十分な機能を備えています。正当な技術的理由がある場合にのみ参照を返してください。参照を返すには、次の構文を使用します:
<?php class foo { public $value = 42; public function &getValue() { return $this->value; } } $obj = new foo; $myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42. $obj->value = 2; echo $myValue; // prints the new value of $obj->value, i.e. 2. ?>
この例では、getValue 関数によって返されるオブジェクトのプロパティには、参照構文を使用しない場合と同様に、コピーされずに値が割り当てられます。
注: パラメーターの受け渡しとは異なり、ここでは両方の場所でアンパサンドを使用する必要があります。これは、通常のコピーではなく参照が返されることを示し、また $myValue が通常の割り当てではなく参照としてバインドされていることを示します。
注: return ($this->value); のように関数から参照を返そうとした場合、参照される変数ではなく式の結果を返そうとしているため、これは機能しません。参照変数を返すことができるのは関数からのみであり、他に方法はありません。コードが動的式または new 演算子の結果を返そうとすると、PHP 4.4.0 および PHP 5.1.0 以降では E_NOTICE エラーが発行されます。