2016-06-20 6 views
1

Ich weiß, dass sobald ein Skript endet, all objects are destroyed und Speicher zurückgegeben wird. Tritt dies auch bei Objekten mit Funktionsumfang auf, wenn die Funktion endet, die ohnehin nicht erreichbar ist?Erfasst PHP-Müllfunktionsobjekte nach einem Anruf zurück?

Zum Beispiel mache ich mir Gedanken über Speicherlecks in meinen PHPUnit-Tests, bei denen ich für fast jeden Test ein neues Objekt erstelle. Wird dies irgendwann meinen Haufen überlaufen, wenn ich genug Tests laufen lasse?

public function testMyFunction() 
{ 
    // Arrange 
    $myObject = new MyClass(); 

    // Act 
    $return = $myObject->myFunction(); 

    // Assert 
    $this->assertEquals(true, $return); 

} 

Soll ich manuell unset ting sie für lang andauernde sein Skripte in einem „Absterge“ Abschnitt?

public function testMyFunction() 
{ 
    // Arrange 
    $myObject = new MyClass(); 

    // Act 
    $return = $myObject->myFunction(); 

    // Assert 
    $this->assertEquals(true, $return); 

    // Absterge 
    unset($myObject); 
} 

Antwort

2

PHP wird Müll sammeln, sobald alle Verweise auf ein Objekt verschwunden sind.

unset wird nicht benötigt. Es ist jedoch möglich, dass Sie eine zirkuläre Abhängigkeit haben. In diesem Fall wird möglicherweise keine Datenmüll gesammelt.

Der einzige Grund für unset() verwenden, wenn Sie Speicher vor das Ende der Funktion befreien möchten. Wenn noch etwas anderes einen Verweis auf die unscharfe Sache enthält, entfernt unset() nur die lokale Variable, aber nicht das Objekt selbst.

Es gibt einen speziellen Speicherbereinigungszyklus, der auch kreisförmige Referenzen aufräumt. Sie können mit dieser Einstellung in der php.ini steuern dies:

http://ca2.php.net/manual/en/info.configuration.php#ini.zend.enable-gc

Wenn Sie bei der Prüfung interessiert sind, ob und wann Ihre Objekte Müll gesammelt bekommen, könnten Sie eine __destruct Methode hinzufügen.

+0

Entschuldigung, es hat so lange gedauert, bis ich meine Antwort getestet habe. Die "__destruct" -Methode zum Testen zu verwenden, war die offensichtliche Erkenntnis, die ich übersehen hatte. Vielen Dank!! –

Verwandte Themen