Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / wenn-ein-string-false-ist.php

Wenn ein String false ist …

Wie ich neulich dazugelernt habe, unterscheidet PHP in Funktionen und Sprachkonstrukte (werden in guten Editoren auch farblich anders hervorgehoben als Funktionen). Und da überlegte ich, ob man auf Grund der Tatsache, dass Sprachelemente sehr schnell sind, nicht irgendwelche logischen Elemente durch eben diese ersetzen kann. Beim Durchschauen habe ich dabei eine der simpelsten Logik-Operationen entdeckt, die in vielen Anwendungen vorkommt: Die Prüfung, ob ein String leer, null, false oder 0 ist.

Mir sind 3 offensichtliche Lösungen eingefallen: Das Sprachelement empty(), der Vergleich !=““ bzw. !=0 und dann noch der Vorteil der schwachen Datentypen in PHP: einfach if($variable).
Das ganze in Code:

$i = "";   // empty-Variante if(empty($i)) echo "leer";   // Vergleich if($i=="") echo "leer";   // Boolean-Variante if(!$i) echo "leer";

Die Vermutung, die ich vor dem Benchmark hatte, war folgende: Der Vergleich ist eine recht komplizierte Geschichte. Das weiß man spätestens, wenn man im Rahmen irgendeiner Informatik-Ausbildung dazu gezwungen wurde das Vergnügen hatte mal eine Funktion zum Vergleichen zu programmieren.
Zu prüfen, ob der Inhalt einer Variablen leer ist, ist aber in Wirklichkeit viel einfacher. Das Sprachkonstrukt empty() arbeitet effektiver, da es eben nur diesen einen Vergleich auf ==““ (bzw. ==0, ==false und ==null) durchführen kann und dazu noch im Core implementiert ist. Dadurch entfällt viel Overhead.
Zusätzlich wirft empty() kein Warning, wenn die Variable noch gar nicht deklariert wurde.

Die Arbeit nur über die Angabe des Variablennamens funktioniert auf diese Art nur in Scriptsprachen, die typenlos oder schwach typengebunden sind. Beispiele hierfür sind Perl oder eben auch PHP.
Dabei gilt eine Variable als false, wenn Sie entweder leer (=““), 0, false oder null ist. Andernfalls ergibt die Abfrage true.

Bei der Arbeit per if($variable) ist darauf zu achten, dass die Variable vorher unbedingt deklariert werden muss, weil es sonst ein Warning geben kann.
Ich vermute deshalb, dass empty() intern in etwa so umgesetzt ist:

function empty($i) { return (isset($i) && $i); }

Möglicherweise sind damit folgende Ergebnisse zu begründen:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_boolean.php 35.440962 s 3.544 ms 100 %
result_empty.php 38.74748 s 3.807 ms 107 % (+ 7%)
result_equal.php 42.410984 s 4.241 ms 120 % (+ 20%)

Wir stellen fest, dass der Vergleich ==““ nur suboptimal ist. Ich habe diese Variante bisher tatsächlich benutzt, aber nach diesem Test, werde ich die Scripte wohl nochmal überarbeiten…
Eindeutiger Testsieger ist die Variante direkt und allein über den Variablennamen. An dieser Stelle sieht man auch, dass empty() nur nötig ist, wenn man die Variable tatsächlich nicht deklariert hat. Das wird aber eigentlich nur bei einer Prüfung auf $_GET-Parameter benötigt, wenn immer mal eine unerschiedliche Anzahl an GET-Parametern übertragen wird.

Also schauen Sie sich einfach mal Ihre Scripte an und gucken, wie oft Sie auf ==0 oder ==““ prüfen. In fast jeder PHP-Datei kommt eine solche Abfrage vor. Simultan kann man das ganze Spiel natürlich auch für !=““, !=0, !=null führen. Für all diese Fälle reicht ein if($i) ....
Aber immer aufpassen, ob dadurch die Logik gleich bleibt. Wenn man nämlich prüfen möchte, ob der User wirklich nichts eingegeben hat oder er eine 0 eingegeben hat, funktioniert wirklich nur if($eingabe==""). Die Prüfung auf empty() bzw. if($eingabe) würde in beiden Fällen true ergeben.

Die Quelltexte und die Ergebnisse können wie immer heruntergeladen werden.