2011-03-29 12 views
34

C++では、大きな配列を関数に渡すと、参照を渡して新しい関数にメモリを浪費しないように渡す必要があります。あなたが変更したくない場合は、const参照で渡します。PHPで参照渡しを使うのは良いですか?

誰でも参照渡しが私のメモリをPHPでも節約できることを確認できますか?私はPHPがC++のような参照のためのアドレスを使用しないことを知っています。それは私が少し不確実な理由です。それが問題です。 PHPで

+1

ちょうどC++関連のノート:関数に渡される配列は実際にはポインタなので、それらには不要であり、実際にあなたが思っていることはしません。 ただし、constには完全に同意してください! – Aaron

答えて

52

を参照してください以下はには適用されません。オブジェクトとして定義されています。配列とスカラ値を参照渡しで渡すと、渡された値を変更しようとするとメモリが節約されます。これは、PHPがcopy-on-change(copy-on-write)ポリシーを使用するためです。たとえば、次のように

# $array will not be copied, because it is not modified. 
function foo($array) { 
    echo $array[0]; 
} 

# $array will be copied, because it is modified. 
function bar($array) { 
    $array[0] += 1; 
    echo $array[0] + $array[1]; 
} 

# This is how bar shoudl've been implemented in the first place. 
function baz($array) { 
    $temp = $array[0] + 1; 
    echo $temp + $array[1]; 
} 


# This would also work (passing the array by reference), but has a serious 
#side-effect which you may not want, but $array is not copied here. 
function foobar(&$array) { 
    $array[0] += 1; 
    echo $array[0] + $array[1]; 
} 

要約すると:

  • を使用すると、関数内でそれを修正するには非常に大きな配列や計画に取り組んでいる場合は、あなたが実際にコピーされ得ることから、それを防ぐために、参照を使用する必要がありますパフォーマンスを大幅に低下させたり、メモリの制限を使い果たしたりする可能性があります。

  • 小さな配列やスカラー値では避けることができますが、私はいつも関数型のアプローチを副作用なしで使用しています。参照によって何かを渡すと、決して確実なことはできません関数の呼び出しの後に渡された変数が保持することがあります。時には、厄介で見つけにくいバグにつながる可能性があります。

  • IMHOスカラー値は、コードの透明性の損失を正当化するほど大きなものにできないため、参照によって渡されるべきではありません。

+0

ありがとうございました。私はコピーオン・チェンジに関する情報を見つけることが困難だったので、 "コピーオンライト"のためのlook(google)とhttp://php.net/manual/en/internals2.variables.intro.php – dennis

8

  • オブジェクトは参照によって渡され - 常に
  • 配列とスカラーは、デフォルトで値によって渡されます。関数の宣言で&を使用してby referenceを渡すことができます。あなたの質問のパフォーマンスの一部については


、PHPはそれでC/C++と同じように扱っていません。次の記事をお読みください:Do not use PHP references


1.それともそれは我々が通常言うことだ - それは「完全に真」ではない場合でも - Objects and references

+0

私はちょっと混乱しています。これは、シングルトンクラスを作成し、それぞれのデータベースを照会するのではなく、サイトの各訪問者への参照を渡すことができるということですか? (すべての訪問者が同じデータを要求しています) – sdadffdfd

+3

PHPでは、「サーバごとに」シングルトンはありませんが、「スクリプトの実行ごとに」シングルトンはありません。各ユーザーには、スクリプトの個別の個別の実行があります。つまり、それぞれに独自のメモリスペースがあります。シングルトンはスクリプトを1回実行するためのシングルトンになります。スクリプトの実行ごとにシングルトンの独自のインスタンスが作成されます。それは悲しいことに –

+0

.. PHPでそのような機能を持つことは素晴らしいだろう。ありがとう。 – sdadffdfd

8

短い答えは、あなたは彼らが提供機能が必要なときに参照を使用しています。メモリの使用量やスピードについて考える必要はありません。変数が読み込み専用の場合、参照渡しは常に遅くなります。

すべてはオブジェクトを含む値で渡されます。しかし、オブジェクトのハンドルが渡されているので、そのように見えるので間違って参照することがよくあります。

次に、どのような機能が提供されますか?あなたは、このような機能が必要なのであれば(ほとんどの場合、あなたはしないでください)

class Bar {} 
$bar = new Bar(); 

function by_val($o) { $o = null; } 
function by_ref(&$o) { $o = null; } 

by_val($bar); // $bar is still non null 
by_ref($bar); // $bar is now null 

、その後、参照を使用する:それはあなたの呼び出し元のスコープで変数を変更することができます。それ以外の場合は、値渡しします。このようになり

機能:

$foo = modify_me($foo); 

は時々参照渡しのための良い候補であるが、関数が変数に渡さ変更することを絶対に明確にする必要があります。 (そして、そのような関数が有用な場合、しばしばそれは本当に自分の私的なデータを変更するクラスの一部でなければならないからです。)

関連する問題