私はC ++の知識があり、ポインターが一般的に使用されていることを知っていますが、PHPのオープンソースコードを調べ始め、メソッドで参照を使用するコードを見たことはありません。
代わりに、コードは、変数への参照をメソッドに渡す代わりに常に戻り値を使用します。その後、変数の値が変更され、そのまま返されます。
参照を使用するとメモリ使用量が少なくなるので、なぜPHPで使用されないのですか?
return array($foo, $bar);およびlist($A, $B) = foobar();
私はC ++の知識があり、ポインターが一般的に使用されていることを知っていますが、PHPのオープンソースコードを調べ始め、メソッドで参照を使用するコードを見たことはありません。
代わりに、コードは、変数への参照をメソッドに渡す代わりに常に戻り値を使用します。その後、変数の値が変更され、そのまま返されます。
参照を使用するとメモリ使用量が少なくなるので、なぜPHPで使用されないのですか?
return array($foo, $bar);およびlist($A, $B) = foobar();
回答:
参照がほとんど使用されないというあなたの主張は誤りです。他の人がすでに言及しているように、参照を使用するネイティブ関数がたくさんあります。注目すべき例には、配列ソート関数とpreg_match()/がありpreg_match_all()ます。コードでこれらの関数のいずれかを使用している場合、参照も使用しています。
さらに、PHPの参照はポインターではありません。あなたはC ++のバックグラウンドから来ているので混乱は理解できますが、PHP参照はまったく異なる獣であり、シンボルテーブルのエイリアスです。C ++参照から予想されるパフォーマンスの向上は、PHP参照には適用されません。
実際、ほとんどのシナリオでは、値渡しは参照渡しよりも高速であり、メモリ集約度が低くなります。PHPのコアであるZend Engineは、変更されるまで変数のコピーを作成しないコピーオンライト最適化メカニズムを使用します。参照渡しは通常、コピーオンライトパターンを破壊し、値を変更するかどうかにかかわらずコピーが必要です。
必要なときにPHPで参照を使用することを恐れないでください。しかし、単に最適化を試みるために使用しないでください。時期尚早の最適化がすべての悪の根源であることを忘れないでください。
参考文献:
f($obj)与えられfunction f($x) { $x = new X; }、持っています$objを参照してください。異なるの呼び出し前よりオブジェクトf()。ただし、オブジェクトは参照渡しではないため、PHPでこれを実行する場合、$ objは変更されません。そのようにして、PHPはJavaと同じことを行います。
PHPは、コピーオンライト機能を既に実行しており、何かを変更するまで新しい値を作成しないため、参照を使用しても多くのメモリが節約されません。これを行うと、PHPが内部的にメモリの使用量を削減し、事態をさらに悪化させるいくつかの機能を混乱させる可能性があります。
それに加えて、参照は一般的に物事を少し魔法的にしすぎるという事実を追加します。デフォルト、つまりほとんどの人が期待しているのは、値渡しです。$i関数に渡すとき、その関数が神秘的に$i他の何かに完全に変化するかどうかを気にしなければならないため、物事を非常に複雑にし、万が一のために防御的なコピーを作成します。($i値がオブジェクトである場合、すでに変更できますが、私の意見ではそうすべきではありません。)
基本的に、私は意味、私がすることを期待変数参照渡し「アウト」パラメータのための便利を見つけるだろう取り戻す機能ではなく、中域、ア・ラからpreg_matchのを&$matches。渡されたオブジェクトを明確に変更する関数であっても、sortまたはのようにarray_pop、少し厄介な感じがしますが...それが私たちが行き詰まっているものです。
そうする多くの php関数を知っています。preg_match()たとえば、ご覧ください。$matches参照渡しされます
参照により引数を取る関数を自分で作成する場合は、次の構文を使用します
function byref(&$a, &$b, $c) {
$a += $c;
$b += $c;
return $a * $b;
}
$ aと$ bは参照によって渡されます$ cは値によって渡されます。