Soweit ich weiß (was sehr wenig ist), gibt es zwei Möglichkeiten:
$var = new object()
Dann:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Andere bessere Methode? Spalte ich hier Haare?
Soweit ich weiß (was sehr wenig ist), gibt es zwei Möglichkeiten:
$var = new object()
Dann:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Andere bessere Methode? Spalte ich hier Haare?
Antworten:
Du suchst unset()
.
Beachten Sie jedoch, dass Sie ein Objekt nicht explizit zerstören können.
Es bleibt dort, aber wenn Sie das Objekt deaktivieren und Ihr Skript PHP an die Speichergrenzen drückt, werden die nicht benötigten Objekte durch Müll gesammelt. Ich würde mitmachen unset()
(anstatt es auf null zu setzen), da es eine bessere Leistung zu haben scheint (nicht getestet, aber in einem der Kommentare aus dem offiziellen PHP-Handbuch dokumentiert).
Beachten Sie jedoch, dass PHP die Objekte immer zerstört, sobald die Seite bereitgestellt wird. Dies sollte also nur bei sehr langen Schleifen und / oder stark intensiven Seiten erforderlich sein.
unset()
entfernt die Referenz auf das Objekt?
Ein praktischer Beitrag, der einige Missverständnisse dazu erklärt:
Rufen Sie den Destruktor nicht explizit auf
Dies deckt mehrere Missverständnisse über die Funktionsweise des Destruktors ab. Wenn Sie es explizit aufrufen, wird Ihre Variable laut PHP5-Dokument nicht zerstört:
PHP 5 führt ein Destruktorkonzept ein, das dem anderer objektorientierter Sprachen wie C ++ ähnelt. Die Destruktormethode wird aufgerufen, sobald keine anderen Verweise auf ein bestimmtes Objekt oder in beliebiger Reihenfolge während der Abschaltsequenz vorhanden sind.
Der obige Beitrag besagt, dass das Setzen der Variablen auf Null in einigen Fällen funktionieren kann, solange nichts anderes auf den zugewiesenen Speicher verweist.
Kurze Antwort: Beides wird benötigt.
Ich habe das Gefühl, dass die richtige Antwort nur minimal gegeben wurde. Ja, im Allgemeinen ist unset () am besten für "Geschwindigkeit" geeignet, aber wenn Sie sofort Speicher zurückfordern möchten (auf Kosten der CPU), sollten Sie null verwenden.
Wie bereits erwähnt, bedeutet das Setzen auf Null nicht, dass alles zurückgefordert wird. Sie können Objekte mit gemeinsamem Speicher (nicht geklont) verwenden, um die Zerstörung des Objekts zu verhindern. Darüber hinaus können Sie, wie andere gesagt haben, die Objekte ohnehin nicht explizit "zerstören", sodass Sie es trotzdem nicht versuchen sollten.
Sie müssen herausfinden, welches für Sie am besten ist. Sie können __destruct () auch für ein Objekt verwenden, das bei unset oder null aufgerufen wird, aber es sollte sorgfältig verwendet werden und, wie andere sagten, niemals direkt aufgerufen werden!
sehen:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
Was ist der Unterschied zwischen der Zuweisung von NULL und nicht gesetzt?
Dies ist ein einfacher Beweis dafür, dass Sie ein Objekt nicht zerstören können, sondern nur einen Link zu ihm.
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
kehrt zurück
2
Sehen Sie es hier in Aktion: https://eval.in/1054130
$var2
worauf Bezug genommen wurde $var
. Jetzt $var
zerstörst du auch und vorausgesetzt, es gibt keine anderen Referenzen, die das Objekt enthalten, bist du fertig.
Möglicherweise befinden Sie sich in einer Situation, in der Sie ein neues mysqli-Objekt erstellen.
$MyConnection = new mysqli($hn, $un, $pw, $db);
aber auch nachdem Sie das Objekt geschlossen haben
$MyConnection->close();
Wenn Sie print_r()
den Inhalt von verwenden $MyConnection
, wird folgende Fehlermeldung angezeigt:
Error:
mysqli Object
Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)
In diesem Fall können Sie nicht verwenden, unlink()
da unlink()
eine Pfadnamenzeichenfolge erforderlich ist, in diesem Fall $MyConnection
jedoch ein Objekt.
Sie haben also eine andere Möglichkeit, den Wert auf null zu setzen:
$MyConnection = null;
Jetzt läuft alles richtig, wie Sie es erwartet haben. Sie haben keinen Inhalt in der Variablen $MyConnection
und haben das mysqli-Objekt bereits bereinigt.
Es wird empfohlen, das Objekt zu schließen, bevor Sie den Wert Ihrer Variablen auf festlegen null
.
Ich würde mit unset gehen, weil es dem Garbage Collector einen besseren Hinweis geben könnte, damit der Speicher früher wieder verfügbar sein kann. Achten Sie darauf, dass alle Dinge, auf die das Objekt verweist, entweder andere Referenzen haben oder zuerst deaktiviert werden, da Sie sonst wirklich auf den Garbage Collector warten müssen, da diese dann keine Handles enthalten.
new
einmal verwenden müssen , wenn wir es einmal verwendendelete
. Dies ist nicht wahr in PHP? Gibt es eine automatische Speicherbereinigung, wenn das Objekt nicht mehr benötigt wird?