web-dev-qa-db-ja.com

PHP)で参照渡しする場合

変数を読み取るだけのときに参照渡しをするのが良い習慣なのか、それとも常に値として渡す必要があるのか​​疑問に思っています。

参照渡しの例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function &do_my_hash(&$value){
   return md5($value);
}

値渡しの例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function do_my_hash($value){
   return md5($value);
}

どちらが良いですか?たとえば、1000ラウンドのループを実行する場合、

ループの例:

for($i = 0 ; $i < 1000 ; $i++){
   $a = 'Fish & Chips '.$i;
   echo do_my_hash($a);
}
31
Vidar Vestnes

value(関数がそれを変更しないように)を渡すつもりなら、参照で渡す理由はありません。「この関数は、渡すものを変更する可能性があると思われるため、コードを理解しにくくするだけです。ああ、変更しませんか?

あなたが提供した例では、あなたのdo_my_hash関数は、渡されるを変更しません。したがって、参照は使用しません。

また、パフォーマンスが気になる場合は、この最近のブログ投稿をお読みください: 使用しないPHP参照

人々が参照を使用するもう1つの理由は、参照によってコードが高速になると考えているためです。しかし、これは間違っています。さらに悪いことに、参照によってコードが遅くなります。はい、参照によってコードが遅くなることがよくあります-申し訳ありませんが、明確にするためにこれを繰り返す必要がありました。

実際、この記事は、主にパフォーマンスに関心がない場合でも、興味深い読み物になる可能性があります;-)

46
Pascal MARTIN

PHPは、可能な限りコピーオンライトを使用するため(通常はパフォーマンスが向上する場合は常に)、参照を使用してもパフォーマンス上の利点は得られません。痛いだけです。参照は、本当に必要な場合にのみ使用してください。 PHPマニュアルから:

実行notパフォーマンスを向上させるために参照によるリターンを使用します。エンジンは自動的にこれを自動的に最適化します。有効な技術的理由がある場合にのみ参照を返します。

12
Matthew

プログラミングの良い習慣は、できる限り常に値を渡すことです。単一の値を変更する必要がある場合は、参照で値を渡すよりも、関数の結果として変更された値を返す方が一般的に優れています。

参照渡しが必要になる可能性があるのは、複数の値を変更する必要がある場合のみです。ただし、これらのケースはまれである傾向があり、問題にアプローチするためのより良い方法がある可能性があるため、通常はコードをチェックするためのフラグとして扱う必要があります。

当時、常に参照渡しと値渡しに使用されていた初期のプログラミング言語は、これが引き起こした問題に取り組むための後の開発でした(遅かれ早かれ、一部のプログラマーが渡されたものを変更するコードを挿入するため、あいまいなバグになってしまう傾向がありますいくつかの関数またはその他の参照値によって、それから場所を特定して適切に修正するのは難しいです-複数の不明瞭な依存関係に終わる傾向があります)。したがって、CPUと複雑さの適切なトレードオフであると考えられていた時点を超えて、複数世代のプロセッサである場合に、これを数マシンサイクルを削減するためのオプションとして真剣に検討することは、かなりひねくれています。コード。

8
Cruachan

マイクロ最適化の喜び。 :-)

正直に言うと、「元のスコープの値に影響を与えたい場合を除いて」、参照によって「通常の」変数を渡すことで得られることはそれほど多くありません。また、PHPなので、5つのオブジェクトは参照によって自動的に渡されます。

3
John Parker

関数内でその値を変更したくない場合、参照渡しは何のメリットもありません。読みやすく、スクリプトのフローがより一貫しているため、可能な限り値渡しを使用するようにしています。

2
Mike Trpcic