質問

私はあちこちで混合信号を取得しています。

アンパサンドを使用して、参照によって変数を渡すかどうか?

次のリンクは、それが非推奨であり、もはや必要ではないことを教えてくれるようです。
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

しかし、このようなスレッドは私を不思議にさせます:
コールタイムパスごとの参照は非推奨ですか?
PHPとAmpersand

私の質問を例として表現させてください。

機能を作成した場合、PHP 5.5.5を使用して:

function recurring_mailer_form($form, $form_state) 
{

}

それは次のようですか:

function recurring_mailer_form($form, &$form_state) 
{

}

?

役に立ちましたか?

解決

異なる記事が異なることを言っているように見える理由は、彼らが異なる種類のパスごとに話しているからです。

参照によってパラメーターを渡す必要があるかどうかを決定する主なものは、関数の署名自体であり、これの基本は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」と呼ばれる手法を使用して、たまたま同じ値が同じメモリを指していると同じ値を持つ複数の変数を残しているためです。参照。実際、一般的に参照割り当て 敗北 この最適化は、エンジンがどの変数をコピーオンライト状態に追跡するかにより、この最適化。

他のヒント

いいえそうではありません。

  • オブジェクトは常に参照として自動的に渡されます(情報! 追加の重要な情報については、以下をご覧ください!)

  • 関数定義で参照としてパラメーターを宣言する必要があります。

    function test(&$var) {}
    

    いいえ それを呼ぶ時点で:

    // wrong
    $var = '123';
    test(&$var);
    


通常どおりオブジェクトを渡すと、オブジェクトの状態(プロパティ)を変更できます。
と仮定する $obj クラスのインスタンスです TestClass 呼び出されたメンバー変数が含まれています hello (ideone.comの完全なサンプルについては、ここをクリックしてください):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

これは自明である必要があります。ここで、同じコードを使用しますが、別の値を割り当てます $obj 代わりに、オブジェクトの状態を変更すると、変更はありません(変更なし)→ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

参照としてパラメーターを明示的に受け入れるだけで、変数のコンテンツを完全に変更する能力が得られます(→ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

いいえ、それらは同じではありません。 PHP 5.4+は、宣言をチェックして関数が呼び出されたときに参照が必要かどうかを通話上で検出します。

したがって、それが意図した使用法である場合、関数宣言に参照演算子が必要なため、廃止されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top