2017-09-23 8 views
1

関数からオブジェクトを返すことがどのように可能なのか分かりません。オブジェクトは渡され、参照によって返されるので、関数内にオブジェクトを作成した場合、関数の実行が終了した後、そのオブジェクトが破棄されることが予想されます。したがって、そのような返されたオブジェクト参照は、存在しない(破棄された)オブジェクトを参照する必要があります。しかし、関数内で作成されたオブジェクトは正常に返されます。どうして??オブジェクトは関数からどのように返されますか?

class O{ 
    public $ppty = "ppty value"; 
} 

function f1(){ 
    $o1 = new O(); 
    return $o1; 
} 

var_dump(f1()); 


**Result:** 
object(O)[15] 
    public 'ppty' => string 'ppty value' (length=10) 
+3

オブジェクトの有効期間は可変期間に接続されていません。 –

+0

@ IgnacioVazquez-Abramsこれについて私に言及できる資料はありますか? –

答えて

5

オブジェクトを「保持」する変数は、実際にオブジェクトへの参照を保持しています。オブジェクトはメモリのどこかに存在し、オブジェクトを参照する変数は単にメモリアドレスを保持している(過度に単純化されている)。 それはです。その参照を返すか、別の変数に代入するときは、参照のコピーが(つまり、メモリアドレスの値がコピーされたことを意味します。たとえば、関数から値0xDEADBEAFを返します。これらの参照は、オブジェクトのプロパティとしてカウントされます。参照カウントが0になったときにのみ(オブジェクトに参照を保持している変数がない)、オブジェクトガベージコレクションが行われます。

2

次の例を検討:

$var = 'test'; 
$ref = &$var; 
unset($ref); 
echo $var; // Echoes "test". 

を解除のみ$refが参照する元の変数を破壊しない、$refから$varの参照を削除します。これは参照するオブジェクトの例と似ていますが、ガベージコレクションではオブジェクトへの変数の参照のみが削除されますが、オブジェクトはまだメモリに存在しています。

詳細については、http://php.net/manual/en/language.references.unset.phpを参照してください。

1

アプリケーションの機能またはスコープが終了すると、アクセスできないローカル変数は削除されます。ただし、クラスからオブジェクトを作成する場合、シナリオは異なります。それらは自動的には削除されません。オブジェクトにアクセスできないオブジェクトを絶えず検索しているガベージコレクタがPHPにあります。見つかった場合は、それらを削除します。

オブジェクト参照を関数から返すと、削除されません。任意の変数に参照を保存しない場合は、後でそれを削除します。このリンクをお読みくださいPHPのガベージコレクタの詳細については

http://php.net/manual/en/features.gc.refcounting-basics.php

0

はPHPではすべての値はzvalsに格納されています。これらのzvalは実際のデータと型情報を含んでいます。次の例をチェックアウトしてください。

<?php 

class O{ 
    public $ppty = "ppty value"; 
} 

$a = new 0; // $a is pointing to zval(class 0) with refcount 1 
$b = $a; // $a and $b are pointing to zval(class 0) with refcount 2 
$c = $b; // $a, $b and $c are pointing to zval(class 0) with refcount 3 

unset($a) // new $b and $c are pointing to zval(class 0) with refcount 2 

// until the refcount is greater then the 0 the destructor will not called 
?> 

今現在のプロセスが終了したら、それは破壊を呼び出します//

<?php 

function f1(){ 
    $o1 = new O(); // refcount = 1 
    return $o1; 
} 

// now you are returning the object in function f1 and so, 
// $o1 is gone after the function scope but the func f1 is now pointing the its reference. 


var_dump(f1()) 


**Result:** 
object(O)[15] 
    public 'ppty' => string 'ppty value' (length=10) 

あなたの例に来る次の例

<?php 

$a = new 0; // $a is pointing to zval(class 0) with refcount 1 

unset($a) // here refcount is 0 and destruct will be called 

?> 

を見てみましょう。

関連する問題