異なる記事が異なることを言っているように見える理由は、彼らが異なる種類のパスごとに話しているからです。
参照によってパラメーターを渡す必要があるかどうかを決定する主なものは、関数の署名自体であり、これの基本はPHP 4以降に変更されていません。
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
ここで、外側の変数 $a
それがとして割り当てられているかのように、値によって関数に渡されています $by_value = $a;
- 変更 $by_value
影響を与えることはできません $a
. 。変数 $b
しかし、渡されています 参照により;フォームの割り当てのように $by_reference =& $b;
これは、2つの名前で参照される変数が1つあり、1つへの割り当てが両方への割り当てとして機能することを意味します。
「通常の」値(文字列、数字、または配列)を値で渡すと、その値は新しい変数にコピーされます。 PHP 5の時点: :ただし、値でオブジェクトを渡すと、わずかに異なることが発生します。コピーされた「値」は、同じオブジェクトへのポインターです。これは、ifを意味します $a
オブジェクトだったので、呼び出すことができます $by_value->some_property = 42;
と $a->some_property
またそうです 42
. 。ただし、新しい値を割り当てた場合 $by_value
, 、それはまだ影響しません $a
.
Php 5.4まで, 、ありました 追加 参照によってパラメーターを渡す方法は、参照動作を「強制」することでした コールタイムで. 。これは、あなたが書くことができることを意味しました foo(&$a, &$b);
に変更された変更を「キャプチャ」します $by_value
内側 foo()
関数。これに依存することは一般的に悪い考えだったので、削除されました。 (PHP 6での除去を目的としていたため、5.4に着陸しましたが、そのプロジェクトは不定のホールドに置かれ、5.3と5.4に着陸しました)。
最後に、機能ができます 戻る 参照による変数(as ここでマニュアルで説明します)。実際にあなたが置く必要があるので、これは少し気が狂っています &
の 2 場所:関数宣言の開始時に、 return
「この変数参照を返す」を意味するはずです。コードでは、その値をコピーするのではなく、その参照に変数を割り当てることです。参照パラメーターとリファレンスリターンを組み合わせた愚かな例を次に示します(2つは一緒に行く必要はありません。これは単なる例です):
function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable,
// but all those operations were by reference
多くの人々は、参照によって変数を渡すことでパフォーマンスの利点が得られると誤って信じていることに注意してください。これは実際には通常間違っています。PHPを電力するZend Engineは、「コピーOn Write」と呼ばれる手法を使用して、たまたま同じ値が同じメモリを指していると同じ値を持つ複数の変数を残しているためです。参照。実際、一般的に参照割り当て 敗北 この最適化は、エンジンがどの変数をコピーオンライト状態に追跡するかにより、この最適化。