PHP でデータを参照ではなく値として渡す場合、測定可能なパフォーマンスの違いはありますか?
変数を参照ではなく値として渡すことができることを知っている人はほとんどないようです。これは常識ですか?
PHP でデータを参照ではなく値として渡す場合、測定可能なパフォーマンスの違いはありますか?
変数を参照ではなく値として渡すことができることを知っている人はほとんどないようです。これは常識ですか?
私の理解では、PHP 5 は単純なデータ型と配列を値で渡しますが、オブジェクトに関しては参照で渡します。これは注意すべき動作のようです - 配列は値で渡されると仮定しているため、コピーを作成する必要がない場合、大きな配列はパフォーマンスに影響を与える可能性があります。
私は、参照渡しを明示的に行い、PHP に任せることに反対する多くの議論を見てきました。
また、オブジェクトを値で渡したい場合は、理想的には複製する必要があります。
大きな変数を値で渡す場合(これはPHP5 +のオブジェクトを除くすべてのデフォルトです)、はい、パフォーマンスに影響を与える可能性があります。
たとえば、ユーザーが大量のPOSTデータを送信した場合、それを関数に通常どおりに渡すと(別名、値渡し)、配列全体をコピーする必要があり、パフォーマンスに影響します。ただし、非常に大規模なサイトを使用していない限り、ヒットに気付かない可能性があります。
参照渡しはPHPで可能ですが、デフォルトではありません(オブジェクトでない限り)。参照渡しを行うには、変数の前に&を追加する必要があります。そうしないと、値だけで渡されます(コピーされます)。PHP5の時点では、オブジェクトは参照によって自動的に渡されますが、PHP5の前に、参照によって明示的に渡す必要があります(つまり、&を追加します)。
最近のバージョンの PHP を使用している場合、オブジェクトは常に参照によって渡されます。他のタイプのように、主な関心事は文字列/配列です。それらのためにそれは依存します。PHP の文字列の実装では、関数の引数に渡す文字列を変更しない場合 (読み取る/スキャンするだけ)、決してコピーされません。この実装は「コピーオンライト」と呼ばれます。配列についてはよくわかりません。これに答えるにはテストが必要です。
値渡しの文字列引数を変更しない限り、参照渡しとの違いはありません。
パフォーマンスの違いがある場合、それは無視できます。参照渡しがパフォーマンスの低下を引き起こしていることがわかっていない限り、この種のマイクロ最適化について心配する必要はありません(ただし、それが当てはまる状況は想像できません)。
余談ですが、グローバル変数を使用するのと同じように、参照によって引数を渡すことは悪い設計を助長するため、一般的にはお勧めしません。
しかし、最後の部分であなたが何を意味したのかはわかりません。PHP はデフォルトで引数を値渡しします。