2012-02-02 14 views
5

変数またはオブジェクトを参照渡しで関数呼び出しに渡すと、メモリ内に2番目のオブジェクトが作成されるのを避けることができ、リソースを保存できると思いますか?例えば:私は$ NEWOBJに「参照」変数を割り当て参照渡しは新しい変数の作成を避けますか?

<?php 

class CoolObject 
{ 
    // Have some properties here 

    public function __construct() 
    { 
     // Do some stuff 
    } 

    public function test() 
    { 
     echo("Test"); 
    } 
} 

function doSomething(&$param) 
{ 
    // Calls original instance, still only one object in memory 
    $param->test(); 

    // Does this create a second instance in memory, or just assign 
    // the reference? 
    $newObj = $param; 
} 

// Create 1st instance of object in memory 
$myObj = new CoolObject; 

// Do a test to determine number of instances created 
doSomething($myObj); 

?> 

は、それは2つにカウントアップ持ち込むメモリに新しいものを作成したのか、それだけではまだ1つのオブジェクトのみを残しての参照を渡すんでした?

答えて

3

参照で変数を渡す場合、オブジェクトを複製しないという点では正しいです。代わりに、ポインタをオブジェクトにコピーします。だから、それはいくつかのメモリを使用している間、それはポインタのサイズに等しいメモリの量だけです。

同じオブジェクトを指す別の変数を作成した場合も、上記と同じ結果を得てポインタをコピーしています。

参照カウントとオブジェクトについては、ポインタをコピーするたびに参照カウンタがインクリメントされます。

参照カウントがゼロの場合のみ、オブジェクトは解放されます。

1

私の理解では、あなたが参照渡した場合、あなたは新しい変数を作成していないということですが、その関数内で使用変数に加えられた変更はまた、あなたが渡された元の変数に影響を与えるでしょう。

+0

わかりました。 2番目の部分はどうでしょうか?$ newObjは$ myObjの新しいインスタンスか "ポインタ"ですか? –

0

オブジェクト常に参照によって渡されます。 &符号を明示的に使用すると、通常は単純なベクトルのみが参照渡しされます。したがって、$myObjは "ポインタ"

+0

最初の文は私がGoogleの検索に必要なものでした。ここで私が学んだのはhttp://php.net/manual/en/language.oop5.references.phpです –

2

オブジェクトの参照と値の一般的な概念は、一般的によく理解されていません。オブジェクト変数は、オブジェクトへのハンドルが含まれ、$xは、いくつかのオブジェクトであり、我々は他の変数のカップルに割り当てるので、もし、これらすべてがそうであるように

$x = new Jim; 
$d = $x; 
$e &= $x; 

2dnと第三の文が安い割り当てていると言う割り当てることですオブジェクトハンドルこれは、例えば、$y=5と同じオーダーのコストです。

$d->somepropertyおよび$d->somemethod()は、$x->somepropertyおよび$x->somemethod()と同じものを指す。同上は$eです。あなたは$d$eに新しい割り当てを行う際に差異が発生します。

$d = new Fred; 
$e = $someotherobject; 

$d$xから別のオブジェクトを参照していますが、$xはそうでない場合は変更されません。 $eの割り当てでは、$eはまだ$xと同じオブジェクトを指しますが、は両方ともからFredを参照しています。これは副作用を作り出しました。故意または偶発的な副作用が生じました。関数の引数でこれを行うことはまったく同じです。

教訓:あなたない限りは、オブジェクトと参照を使用しないでください本当にあなたは何をしているかを理解し、なぜ、そしてどのような落とし穴があります。

関連する問題