Eine Variable vs. auf '' setzen

8

Ist es besser, eine der folgenden Möglichkeiten zu nutzen? Wenn nicht, ist einer von ihnen schneller als der andere?

%Vor%

oder tun

%Vor%     
waiwai933 11.01.2010, 04:11
quelle

6 Antworten

11

sie werden etwas andere Dinge tun:

  • unset löscht die Variable aus der Symboltabelle und dekrementiert den Verweiszähler auf den Inhalt um 1. Verweise auf die Variable danach werden eine Notiz auslösen ("undefinierte Variable"). (Beachten Sie, dass ein Objekt das standardmäßige Deaktivierungsverhalten für seine Eigenschaften durch Implementierung von __unset ()) überschreiben kann.

  • Wenn Sie auf eine leere Zeichenfolge setzen, wird die Referenzzählung für den Inhalt um 1 dekrementiert, der Inhalt wird auf eine Zeichenfolge mit der Länge 0 gesetzt, das Symbol bleibt jedoch weiterhin in der Symboltabelle und Sie können weiterhin auf die Variable verweisen . (Beachten Sie, dass ein Objekt das Standardzuweisungsverhalten für seine Eigenschaften durch Implementierung von __set ()) überschreiben kann.

in älteren php's, wenn der ref count auf 0 fällt, wird der Destruktor aufgerufen und der Speicher wird sofort freigegeben. In neueren Versionen (& gt; = 5.3) verwendet PHP ein gepuffertes Schema, das eine bessere Handhabung für zyklische Referenzen ( Ссылка ), so dass die Erinnerung möglicherweise später freigegeben wird, so dass sie möglicherweise überhaupt nicht verzögert wird ... in jedem Fall verursacht das nicht wirklich Probleme und der neue Algorithmus verhindert bestimmte Speicherlecks .

Wenn der Variablenname nicht erneut verwendet wird, sollte Unset einige CPU-Zyklen schneller sein (da keine neuen Inhalte erstellt werden müssen). aber wenn der Variablenname wiederverwendet wird, müsste PHP einen neuen Variablen- und Symboltabelleneintrag erstellen, damit er langsamer wird! Der Unterschied wäre in den meisten Situationen ein vernachlässigbarer Unterschied.

Wenn Sie die Variable für eine spätere Überprüfung als ungültig markieren möchten, können Sie sie auf false oder null setzen. das wäre besser als das Testen mit isset (), weil ein Tippfehler im Variablennamen false ohne irgendeinen Fehler zurückgeben würde ... Sie können auch false und null Werte an eine andere Funktion übergeben und den Sentinel-Wert behalten, was nicht möglich ist eine unset var ...

Ich würde also sagen:

%Vor%

oder

%Vor%

wäre besser für die Überprüfung von Sentinel-Werten als

%Vor%     
jspcal 11.01.2010, 04:16
quelle
2

Technisch wird $test = '' zu

zurückkehren %Vor%

Da es immer noch 'gesetzt' ist, wird es einfach auf einen leeren Wert gesetzt.

Es wird jedoch zu

zurückkehren %Vor%

wie es eine leere Variable ist. Es hängt nur davon ab, was Sie suchen. Im Allgemeinen tendieren Leute dazu, zu überprüfen, ob eine Variable gesetzt ist, und nicht, wenn sie leer ist.

Es ist also besser, es komplett zu deaktivieren.

Auch das ist leichter zu verstehen

%Vor%

als das

%Vor%

Der erste sagt Ihnen sofort, dass die Variable nicht länger gesetzt ist. Wo das Letztere Ihnen einfach sagt, dass es auf einen leeren Raum gesetzt wird. Dies wird häufig verwendet, wenn Sie einer Variablen Inhalt hinzufügen und nicht möchten, dass PHP bei Ihnen fehlerhaft wird.

    
Tyler Carter 11.01.2010 04:16
quelle
2

Sie tun verschiedene Dinge, der Zweck von unset ist es, die angegebene Variable im Kontext zu löschen, wo Sie es machen, Ihr zweites Beispiel setzt die Variable einfach auf eine leere Zeichenkette.

Das Deaktivieren einer Variablen erzwingt kein sofortiges Speicherbefreien. Wenn Sie sich Sorgen um die Leistung machen, ist es möglicherweise eine bessere Option, die Variable auf NULL zu setzen, aber der Unterschied wird nicht auffallen ...

Diskutiert in der docs :

  

unset () macht genau das, was der Name sagt   - lösche eine Variable. Es erzwingt keine sofortige Speicherbefreiung. PHPs   Müllsammler wird es tun, wenn es   so bald wie möglich   diese CPU-Zyklen werden sowieso nicht benötigt,   oder so spät wie vor dem Drehbuch   keinen Speicher mehr haben, was auch immer auftritt   zuerst.

     

Wenn Sie $ what = null machen;   dann überschreiben Sie Variablen   Daten. Sie könnten Speicher freigegeben bekommen /   geschrumpft schneller, aber es kann CPU stehlen   Zyklen aus dem Code, der wirklich benötigt   sie früher, was zu einer längeren Zeit führt   Gesamtausführungszeit.

    
CMS 11.01.2010 04:17
quelle
2

Ich denke, der wichtigste Unterschied besteht darin, dass das Unscharfschalten einer Variablen mitteilt, dass die Variable nicht vom nachfolgenden Code verwendet wird (sie "erzwingt" dies auch, indem sie ein E_NOTICE meldet, wenn Sie versuchen, es zu verwenden, wie jspcal gesagt hat, weil es nicht ist) in der Symboltabelle).

Wenn also die leere Zeichenfolge ein gesetzlicher (oder sentinel) Wert für was auch immer Sie mit Ihrer Variablen tun, gehen Sie voran und setzen Sie es auf "". Andernfalls, wenn die Variable nicht mehr nützlich ist, sorgt das Deaktivieren für eine klarere Codeabsicht.

    
Jon 11.01.2010 04:19
quelle
0

Sie haben völlig unterschiedliche Bedeutungen. Ersteres macht eine Variable nicht existent. Letzteres legt nur den Wert auf die leere Zeichenfolge fest. Es spielt keine Rolle, wer sozusagen "besser" ist, denn sie sind für ganz andere Dinge.

Versuchen Sie, Speicher oder etwas aufzuräumen? Wenn ja, nicht; PHP verwaltet Speicher für Sie, so dass Sie es herumliegen lassen können und es wird automatisch bereinigt.

Wenn Sie nicht versuchen, Speicher aufzuräumen, müssen Sie warum herausfinden, um eine Variable zu deaktivieren oder sie auf leer zu setzen, und die entsprechende Variable auswählen. Eine gute Plausibilitätsprüfung dafür: Nehmen wir einmal an, jemand hat die folgende Codezeile irgendwo nach Ihrer nicht gesetzten / leeren eingefügt:

%Vor%

Und dann später:

%Vor%

Bei der ersten wird do_something() ausgeführt, wenn Sie die Variable auf die leere Zeichenfolge setzen. Die zweite wird do_something_else() ausführen, wenn Sie die Variable deaktivieren. Welche davon erwarten Sie, wenn Ihr Skript ordnungsgemäß funktioniert?

    
jakeboxer 11.01.2010 04:19
quelle
0

Es gibt noch ein weiteres 'Gotcha', das hier zu beachten ist, die Referenz.

wenn Sie hatten:

%Vor%

Dann ist eine Ihrer beiden Alternativen ganz anders.

%Vor%

setzt sowohl $ variable als auch $ a auf den leeren String, wobei

gilt %Vor%

entfernt die Referenzverknüpfung zwischen $ a und $ Variable, während $ variable aus der Symboltabelle entfernt wird. Dies ist in der Tat die einzige Möglichkeit, um $ a und $ Variable zu lösen, ohne $ variable auf etwas anderes zu setzen. B. $ variable = null; werde es nicht tun.

    
Don 11.01.2010 05:16
quelle

Tags und Links