it-swarm.com.de

Null vs. False vs. PHP

Mir wurde gesagt, dass gute Entwickler den Unterschied zwischen Null und False und 0 und allen anderen guten "nichts" -Entitäten erkennen/nutzen können.
Was ist der Unterschied, speziell in PHP? Hat es etwas mit === zu tun?

130
stalepretzel

Es ist sprachspezifisch, aber in PHP:

Nullbedeutet " nichts ". Die var wurde nicht initialisiert.

Falsebedeutet " nicht wahr in einem booleschen Kontext ". Wird verwendet, um explizit zu zeigen, dass Sie sich mit logischen Problemen beschäftigen.

0ist eineint. Mit dem Rest oben nichts zu tun, benutzt für Mathematik.

Das Schwierige daran ist, dass in dynamischen Sprachen wie PHP alle einen Wert in einem booleschen Kontext haben, der (in PHP) False ist.

Wenn Sie es mit == testen, wird der boolesche Wert getestet, sodass Sie Gleichheit erhalten. Wenn Sie es mit === testen, wird der Typ getestet und Sie erhalten Ungleichheit.

Warum sind sie nützlich?

Schauen Sie sich die Funktion strrpos() an. Gibt False zurück, wenn nichts gefunden wurde, aber 0, wenn am Anfang der Zeichenfolge etwas gefunden wurde!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

Und natürlich, wenn Sie sich mit Staaten befassen:

Sie möchten unterscheiden zwischen DebugMode = False (auf off gesetzt), DebugMode = True (auf on eingestellt) und DebugMode = Null (nicht gesetzt, führt zu hartem Debugging ;-)).

197
e-satis

null ist null. false ist false. Traurig aber wahr.

es gibt nicht viel Konsistenz in PHP. Die EntwicklerVERSUCHENum Null zu bedeuten bedeutet "unbekannt" oder "nicht vorhanden". häufig wird False jedoch als "nicht vorhanden" verwendet (z. B. gibt strrpos ("fail", "search") false zurück und nicht null)

sie werden häufig sehen, dass Null verwendet wird, wenn sie bereits falsch für etwas verwenden. z.B. filter_input (). Sie geben false zurück, wenn die Variable den Filter nicht besteht. und null, wenn die Variable nicht vorhanden ist (bedeutet nicht, dass der Filter ebenfalls fehlgeschlagen ist? Warum wird sogar null zurückgegeben?!?)

php bietet den Komfort, Daten in den Funktionen zurückzugeben. und dann stauen sich die Entwickler in allen Arten von Fehlerzuständen anstelle der Daten.

Und es gibt keinen vernünftigen Weg in PHP, um Daten (int, str usw.) nach einem Fehler zu erkennen (false, null).

sie müssen so ziemlich immer auf === null oder === false testen, je nach Funktion. oder für beide, in Fällen wie filter_input ()/filter_var ()

und hier macht etwas Spaß mit Typ Jonglieren. Nicht einmal Arrays und Objekte.

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)
41
gcb

Unten ist ein Beispiel:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

Bitte sehen Sie dies für mehr Referenz von Typvergleichen in PHP. Es sollte Ihnen ein klares Verständnis vermitteln.

14
KristCont

In PHP können Sie mit den Operatoren === und! == nicht nur prüfen, ob die Werte gleich sind, sondern auch, ob ihre Typen übereinstimmen. So zum Beispiel: 0 == false ist true, aber 0 === false ist false. Dasselbe gilt für != gegenüber !==. Wenn Sie null mit den beiden anderen Operatoren vergleichen, erwarten Sie ähnliche Ergebnisse.

In PHP wird diese Qualität von Werten normalerweise verwendet, wenn ein Wert zurückgegeben wird, der manchmal 0 (null) sein kann, aber manchmal kann es sein, dass die Funktion fehlgeschlagen ist. In solchen Fällen geben Sie in PHP false zurück und müssen diese Fälle mit dem Identitätsoperator === überprüfen. Wenn Sie beispielsweise nach einer Position einer Zeichenfolge in der anderen suchen und strpos() verwenden, gibt diese Funktion die numerische Position zurück, die 0 sein kann, wenn die Zeichenfolge ganz am Anfang gefunden wird, die Zeichenfolge jedoch nicht gefunden wird ansonsten gibt strpos()false zurück, und Sie müssen dies beim Umgang mit dem Ergebnis berücksichtigen.

Wenn Sie dieselbe Technik in Ihren Funktionen verwenden, wird jeder, der mit der Standardbibliothek PHP vertraut ist, verstehen, was vor sich geht, und wie Sie prüfen können, ob der zurückgegebene Wert der gewünschte ist oder ob während der Verarbeitung Fehler aufgetreten sind. Das Gleiche gilt für Funktionsparameter. Sie können sie unterschiedlich verarbeiten, je nachdem, ob es sich um Arrays oder Strings handelt oder was nicht. Diese Methode wird auch in PHP häufig verwendet, sodass jeder es leicht bekommt. Ich denke, das ist die Macht.

5
inkredibl

False, Null, Nichts, 0, Undefiniert usw. usw.

Jede von ihnen hat bestimmte Bedeutungen, die mit den tatsächlichen Konzepten korrelieren. Manchmal werden mehrere Bedeutungen in einem einzelnen Schlüsselwort oder Wert überladen.

In C und C++ sind NULL, False und 0 mit demselben Wert überladen .. _. In C # sind dies drei verschiedene Konzepte.

null oder NULL weisen normalerweise auf einen fehlenden Wert hin, geben jedoch normalerweise nicht an, warum .0 die natürliche Zahl Null angibt und die Typäquivalenz mit 1, 2, 3, usw. und in unterstützten Sprachen hat Einzelne Konzepte von NULL sollten nur eine Zahl sein.

False zeigt Nicht-Wahrheit an. Und es wurde in binären Werten verwendet. Es bedeutet nicht unset oder 0. Es zeigt einfach einen von zwei binären Werten an.

Nichts kann darauf hindeuten, dass der Wert spezifisch so eingestellt ist, dass er nichts ist, was dasselbe wie Null bedeutet, jedoch mit Absicht.

Nicht definiert in einigen Sprachen bedeutet, dass der Wert noch festgelegt werden muss, da kein Code einen tatsächlichen Wert angegeben hat.

5
Orion Adrian

Ich habe gerade einen halben Tag verschwendet und versucht, entweder eine 0, Null oder eine falsche Rückgabe von strpos zu erhalten!

Hier ist alles, was ich versuchte, bevor ich herausfand, dass die Logik nicht in die richtige Richtung floss und anscheinend ein schwarzes Loch in der PHP-Codierung vorlag:

Konzept Nehmen Sie einen auf einem Server gehosteten Domainnamen, und stellen Sie sicher, dass es sich nicht um eine Root-Ebene handelt. Es gibt verschiedene Möglichkeiten, dies zu tun, aber ich habe mich aufgrund der anderen PHP-Funktionen/Konstrukte, die ich gemacht habe, entschieden.

Wie auch immer, hier war die Grundlage der Abgabe:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) { do this } else {or that}
{
    echo strpos(mydomain.co.uk, mydomain);  

    if ( strpos(mydomain, xmas) == null ) {echo "\n1 is null"; }
    if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) {echo "\n2 is 0"; }else {echo "\n2 Something is WRONG"; }

    if ( (mydomain.co.uk, mydomain)) != 0 ) {echo "\n3 is 0"; }else {echo "\n3 it is not 0"; }

    if ( (mydomain.co.uk, mydomain)) == null ) {echo "\n4 is null"; }else {echo "\n4 Something is WRONG"; }
}

ENDLICH nachdem ich dieses Thema gelesen hatte, Ich fand, dass dies funktionierte !!!

{
    if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

Vielen Dank für diesen Artikel, ich verstehe jetzt, dass Weihnachten zwar nicht Weihnachten ist, aber es kann auch ein falscher Tag sein!

Nachdem ich einen Tag mit dem Debuggen von einfachem Code verschwendet hatte, wünschte ich mir, ich hätte das vorher gewusst, da ich mich mit dem Problem hätte identifizieren können, anstatt überall herumzugehen und zu versuchen, es zum Laufen zu bringen , Null und 0 sind nicht alle gleich True oder False oder Null?

4
madesignUK

Die Unterschiede zwischen diesen Werten beruhen immer auf detaillierten sprachspezifischen Regeln. Was Sie für PHP lernen, gilt nicht unbedingt für Python oder Perl oder C usw. Es ist zwar wichtig, die Regeln für die Sprache (n), mit der Sie arbeiten, zu lernen und sich zu sehr auf sie zu verlassen bittet um Ärger. Das Problem tritt auf, wenn der nächste Programmierer Ihren Code beibehalten muss und Sie ein Konstrukt verwendet haben, das einige kleine Details von Null vs. False (beispielsweise) nutzt. Ihr Code sollte korrekt aussehen (und umgekehrt - falscher Code sollte falsch aussehen ).

1
Greg Hewgill

In Datenbanken wird Null verwendet, um "kein Datensatz" oder "keine Informationen" darzustellen. Möglicherweise haben Sie ein kleines Feld, in dem beschrieben wird: "Möchte dieser Benutzer E-Mails von uns erhalten?". True bedeutet, dass dies der Fall ist. False bedeutet, dass Sie nichts gesendet bekommen möchten. Ich weiß es nicht. Sie können durch äußere Verbindungen und dergleichen entstehen. 

Die logischen Implikationen von Null sind oft unterschiedlich - in einigen Sprachen ist NULL nicht gleichbedeutend mit nichts, wenn also (a == NULL) immer falsch ist.

Ich persönlich würde also immer einen Boolean-Wert auf FALSE initialisieren, und einen NULL-Wert zu initialisieren, würde ein bisschen icky aussehen (selbst in C, wo die beiden nur 0 sind ... nur eine Stilrichtung).

1
Peter

In PHP hängt es davon ab, ob Sie Typen validieren:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Technisch Null ist 0x00 aber in PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 ist ein ganzzahliger Wert.

1
Gavin M. Roy

Ich denke, schlechte Entwickler finden in diesem Code alle verschiedenen Verwendungen von null/0/false.

Beispielsweise ist es einer der häufigsten Fehler, den Entwickler machen, den Fehlercode in Form von Daten mit einer Funktion zurückzugeben.

// On error GetChar returns -1
int GetChar()

Dies ist ein Beispiel für eine Zuckerschnittstelle. Dies wird im Buch "Debuggen des Softwareentwicklungsprozesses" und auch in einem anderen Buch "Schreiben von korrektem Code" erläutert. 

Das Problem dabei sind die Implikationen oder Annahmen, die für den Char-Typ gemacht wurden. Bei einigen Compilern kann der Char-Typ nicht signiert sein. Auch wenn Sie -1 zurückgeben, kann der Compiler stattdessen 1 zurückgeben. Diese Art von Compilerannahmen in C++ oder C ist schwer zu erkennen.

Stattdessen mischen Sie den Fehlercode nicht mit Ihren Daten. Also die folgende Funktion.

char GetChar()

jetzt wird

// On success return 1
// on failure return 0
bool GetChar(int &char)

Dies bedeutet, egal wie jung der Entwickler in Ihrem Entwicklungs-Shop ist, er oder sie wird das niemals falsch verstehen. Dabei geht es nicht um Redudanz oder Abhängigkeiten im Code.

Im Allgemeinen ist der Austausch von Bool als erstem Klasse-Typ in der Sprache in Ordnung, und ich denke, dass Joel kürzlich mit seinem Postcast darüber gesprochen hat. Versuchen Sie jedoch nicht, Mix- und Match-Bools mit Ihren Daten in Ihren Routinen zu verwenden, und Sie sollten vollkommen in Ordnung sein.

1
Chad

Aus der PHP Online-Dokumentation :

"* Um einen Wert explizit in boolean zu konvertieren, verwenden Sie die (bool) oder (boolean) Casts. In den meisten Fällen ist der Cast jedoch unnötig, da ein Wert automatisch konvertiert wird, wenn ein Operator, eine Funktion oder eine Kontrollstruktur ein boolesches Argument erfordert Bei der Konvertierung nach Boolean werden die folgenden Werte als FALSE betrachtet: * Der Boolean FALSE selbst * Die Ganzzahl 0 (Null) * Der Float 0.0 (Null) * Der leere Wert Zeichenfolge und die Zeichenfolge "0" * ein Array mit Nullelementen * ein Objekt mit Null-Member-Variablen (nur PHP 4) * der spezielle Typ NULL (einschließlich unset-Variablen) * SimpleXML Objekte, die aus leeren Tags erstellt wurden Jeder andere Wert wird als WAHR betrachtet (einschließlich aller Ressourcen). * "

In den meisten Fällen ist es dasselbe.

Andererseits sind "===" und "==" nicht dasselbe. Normalerweise benötigen Sie nur den Operator "Gleich". Zu klären:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Weitere Informationen finden Sie auf der Seite " Vergleichsoperatoren " in den Online-Dokumenten von PHP. 

Hoffe das hilft.

1

Null ist nichts, False ist ein Bit und 0 ist (wahrscheinlich) 32 Bit.

Kein PHP Experte, aber in einigen der moderneren Sprachen sind diese nicht austauschbar. Ich vermisse es, 0 und false austauschbar zu sein, aber da Boolean ein tatsächlicher Typ ist, können Methoden und Objekte zugeordnet werden, so dass dies nur ein Kompromiss ist. Null ist jedoch null, das Fehlen von etwas im Wesentlichen.

0
CodeRedick

Falsch und 0 sind konzeptionell ähnlich, d. H. Sie sind isomorph. 0 ist der Anfangswert für die Algebra der natürlichen Zahlen und Falsch ist der Anfangswert für die Boolesche Algebra.

Mit anderen Worten, 0 kann als die Zahl definiert werden, die, wenn sie zu einer natürlichen Zahl addiert wird, dieselbe Zahl ergibt:

x + 0 = x

In ähnlicher Weise ist False ein Wert, bei dem eine Trennung von diesem Wert und jedem anderen Wert derselbe Wert ist:

x || False = x

Null ist konzeptuell etwas völlig anderes. Je nach Sprache gibt es unterschiedliche Semantiken, aber keiner von ihnen beschreibt einen "Anfangswert" als False und 0 sind. Es gibt keine Algebra für Null. Es bezieht sich auf Variablen, in der Regel, um anzugeben, dass die Variable im aktuellen Kontext keinen bestimmten Wert hat. In den meisten Sprachen sind für Null keine Operationen definiert, und es ist ein Fehler, Null als Operanden zu verwenden. In einigen Sprachen gibt es einen speziellen Wert namens "bottom" statt "null", der ein Platzhalter für den Wert einer Berechnung ist, der nicht beendet wird.

Ich habe an anderer Stelle ausführlicher über die Auswirkungen von NULL geschrieben.

0
Apocalisp

Nun, ich kann mich an meine PHP Tage nicht genug erinnern, um den "===" -Teil zu beantworten, aber für die meisten Sprachen im C-Stil sollte NULL im Zusammenhang mit Zeigerwerten verwendet werden, false als Boolean und null als numerischer Wert wie ein int. '\ 0' ist der übliche Wert für einen Zeichenkontext. Normalerweise ziehe ich auch 0.0 für Floats und Doubles vor.

Also ... die schnelle Antwort lautet: Kontext.

0
jasonmray

In fast allen modernen Sprachen bezieht sich null logically auf Zeiger (oder Referenzen), die keinen Wert haben, oder auf eine Variable, die nicht initialisiert ist. 0 ist der ganzzahlige Wert von Null und False ist der Boolesche Wert von Falsch. Um es komplizierter zu machen, werden in C beispielsweise null, 0 und falsch auf die gleiche Weise dargestellt. Ich weiß nicht, wie es in PHP funktioniert.

Um es noch komplizierter zu machen, haben Datenbanken ein Konzept der Null, was bedeutet, dass sie fehlt oder nicht anwendbar ist, und die meisten Sprachen haben keine direkte Möglichkeit, eine DBNull ihrer Null zuzuordnen. Bis vor kurzem gab es beispielsweise keine Unterscheidung zwischen einem int-Wert und einem null-Wert, der jedoch mit nullfähigen Ints geändert wurde.

Tut mir leid, dass ich diesen Sound kompliziert machen muss. Es ist nur so, dass dies seit Jahren ein harter Punkt in Sprachen ist, und bis vor kurzem gab es noch keine klare Lösung. Die Leute pflegten Dinge einfach zusammen zu machen oder Leerstellen oder Nullen in der Datenbank darzustellen, was nicht immer gut funktioniert.

0
Charles Graham

Jemand kann mir erklären, warum "NULL" in einer Vergleichsinstanz nicht nur eine Zeichenfolge ist?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!
0
vladzur

Im Allgemeinen neigen Programmiersprachen dazu, Wahrheitswerte und falsche Werte zu haben. Die Regeln für das, was wahr ist und was falsch ist, variieren von Sprache zu Sprache.

http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting

0
Liam

Eine interessante Tatsache zu NULL in PHP: Wenn Sie eine var gleich NULL setzen, ist dies dasselbe, als hätten Sie unset () darauf gerufen.

NULL bedeutet im Wesentlichen, dass einer Variablen kein Wert zugewiesen wurde. false ist ein gültiger boolescher Wert, 0 ist ein gültiger ganzzahliger Wert und PHP hat eine ziemlich hässliche Konvertierung zwischen 0, "0", "" und "false".

0
dirtside