Null vs. False vs. 0 in PHP

146

Mir wurde gesagt , dass gute Entwickler kann den Unterschied zwischen Kassa- / nutzen Nullund Falseund 0und alle anderen gut „nichts“ Entitäten.
Was ist der Unterschied, speziell in PHP? Hat es etwas damit zu tun ===?

Stalepretzel
quelle
Es ist fast unmöglich, wirklich herauszufinden, wann was verwendet wird. Ich denke, es ist wichtig, dass Sie konsequent sind, wann nullund wann Sie verwenden false. Ich ziehe mit , nullwenn einen Wert von einer Methode abrufen, weil ich verwenden kann , issetum zu bestimmen , ob ein Wert anstelle der Verwendung zurückgeführt wird , emptydie in Konto nicht stattfinden wird: false, 0, '0'oder eine leere Zeichenfolge, die tragfähige Werte in vielen Situationen sein kann. Für mich ist es die sauberste Lösung in einem chaotischen Konstrukt.
JMRC

Antworten:

221

Es ist sprachspezifisch, aber in PHP:

Nullbedeutet " nichts ". Die Variable wurde nicht initialisiert.

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

0ist ein int. Nichts mit dem Rest oben zu tun, der für die Mathematik verwendet wird.

Was nun schwierig ist, ist, dass in dynamischen Sprachen wie PHP alle einen Wert in einem booleschen Kontext haben , der (in PHP) ist False.

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 eine Ungleichung.

Warum sind sie also nützlich?

Schauen Sie sich die strrpos()Funktion an. Es gibt False zurück, wenn es nichts gefunden hat, aber 0, wenn es etwas am Anfang des Strings gefunden hat!

<?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 einen Unterschied machen zwischen DebugMode = False(auf Aus setzen), DebugMode = True(auf Ein setzen) und DebugMode = Null(überhaupt nicht gesetzt, führt zu einem harten Debugging ;-)).

e-satis
quelle
39
Hinweis zu Null: PHP verwendet es als "kein Wert", aber dies ist keine gute Angewohnheit. Im Allgemeinen bedeutet Null "unbekannter Wert", der sich von "kein Wert" oder "nicht initialisierte Variable" unterscheidet. Nichts plus 1 ist 1, während ein unbekannter Wert plus eins ein unbekannter Wert ist. Denken Sie daran, dass jeder auf null angewendete Operator zu null führt (sollte), da jede Operation mit einem "unbekannten Wert" zu einem unbekannten Wert führt.
Eli
7
Denken Sie daran, dass dies alles Absichten sind . nichts damit zu tun, was in der Realität passiert. In der Realität kann eine Funktion für nicht vorhandene Werte (z. B. strpos, input_filter) false und für einen Fehler (z. B. input_filter) null zurückgeben. Die Antwort lautet also: Verwenden Sie === false und / oder === null, nachdem Sie diese spezielle Funktionsdokumentation gelesen haben.
GCB
5
@Eli: Woher kommt die Idee, dass Null im Allgemeinen "unbekannter Wert" bedeutet. Ich kann mir keine Computersprachen vorstellen, in denen dies zutrifft, und es bedeutet auch nicht, dass auf Englisch zumindest keine Definition vorliegt, die ich finden oder gehört habe. Vielleicht weißt du etwas, was ich nicht weiß?
Bilderstürmer
2
@iconoclast - Ich nehme es aus der Datenbankwelt. Soweit ich weiß, wird null als Platzhalter für einen Datenwert verwendet, der nicht in der Datenbank vorhanden oder unbekannt ist. Siehe dev.mysql.com/doc/refman/5.0/de/working-with-null.html oder en.wikipedia.org/wiki/Null_%28SQL%29 .
Eli
2
Eli ist nicht falsch. Er sagt, dass Sie semantisch, wenn Sie null verwenden, anderen Programmierern signalisieren, dass Sie nicht wissen, was dort drin ist. Es ist undefiniert. Wenn Sie 0 verwenden, signalisieren Sie, dass Sie wissen, was sich darin befindet: eine Zahl. Und hier steht die Zahl für das Fehlen von Dingen. Denken Sie daran, dass Werte eine Form der Dokumentation sind, unabhängig davon, wie PHP Werte bedroht, Werte eine Bedeutung haben.
E-Satis
45

nullist null. falseist false. Traurig aber wahr.

Es gibt nicht viel Konsistenz in PHP. Die Entwickler VERSUCHEN , null zu machen, bedeutet "unbekannt" oder "nicht existent". aber oft wird False als 'nicht existent' dienen (z. B. wird strrpos ('fail', 'search') false und nicht null zurückgeben)

Sie werden oft sehen, dass null verwendet wird, wenn sie bereits false für etwas verwenden. zB filter_input (). Sie geben false zurück, wenn die Variable den Filter nicht besteht. und null, wenn die Variable nicht existiert (bedeutet nicht vorhanden, dass auch der Filter fehlgeschlagen ist? Warum also überhaupt null zurückgeben?!?)

PHP hat den Komfort, Daten in den Funktionen zurückzugeben. und oft drängen sich die Entwickler auf alle Arten von Fehlerstatus anstelle der Daten.

Und es gibt in PHP keine vernünftige Möglichkeit, Daten (int, str usw.) nach einem Fehler (false, null) zu erkennen.

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

und hier ist ein bisschen Spaß mit Typ Jonglieren. nicht einmal Arrays und Objekte enthalten.

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)
gcb
quelle
24
In meiner Meinung ist 0 == null absoluter Unsinn, da 0 ein Wert und null ein Flag ist, das anzeigt, dass die Variable nicht initialisiert ist. Vielen Dank PHP-Team
Mercsen
1
Sie haben Ihren Codeabschnitt beginnend mit zweimal wiederholt var_dump( null == 0 );.
Sparky
2
was ist wirklich komisch in php: null <-1 => TRUE
thehpi
1
@mercsen Zumindest wenn sich PHP konsequent wie 0 == null verhalten hätte, wäre ich damit einverstanden gewesen. Seltsamerweise 0 == nullund null == [], aber [] != 0!!
Nawfal
1
strrpos('fail', 'search') will return false, and not nullMeiner Meinung nach ist das richtig - wenn die nullMittel unbekannt sind strrpos, nullwürde die Rückkehr so aussehen, als würde man sagen: "Ich weiß nicht, ob die Zeichenfolge vorhanden ist" und nicht "Die Zeichenfolge ist nicht vorhanden".
Eborbob
22

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

Weitere Informationen zu Typvergleichen in PHP finden Sie hier. Es sollte Ihnen ein klares Verständnis geben.

KristCont
quelle
5

In PHP können Sie mit den Operatoren === und! == Nicht nur prüfen, ob die Werte gleich sind, sondern auch, ob ihre Typen übereinstimmen. Also zum Beispiel: 0 == falseist true, aber 0 === falseist false. Das gleiche gilt für !=versus !==. nullErwarten Sie ähnliche Ergebnisse, wenn Sie mit den beiden genannten Operatoren mit den beiden anderen vergleichen.

In PHP wird diese Wertequalität 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 kehren falseSie in PHP zurück und müssen mit dem Identitätsoperator nach diesen Fällen suchen ===. Wenn Sie beispielsweise nach einer Position einer Zeichenfolge in der anderen suchen und strpos()diese 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 Alle werden dann strpos()zurückkehren falseund Sie müssen dies berücksichtigen, wenn Sie mit dem Ergebnis umgehen.

Wenn Sie dieselbe Technik in Ihren Funktionen verwenden, wird jeder, der mit der Standard-PHP-Bibliothek vertraut ist, verstehen, was vor sich geht und wie überprüft werden kann, ob der zurückgegebene Wert dem gewünschten Wert entspricht oder ob während der Verarbeitung ein Fehler aufgetreten ist. Das Gleiche gilt für Funktionsparameter. Sie können sie unterschiedlich verarbeiten, je nachdem, ob es sich um Arrays oder Strings handelt oder nicht. Diese Technik wird auch in PHP häufig verwendet, sodass jeder sie problemlos erhalten kann. Ich denke, das ist die Macht.

inkredibl
quelle
5

Falsch, Null, Nichts, 0, Undefiniert usw. usw.

Jedes von diesen hat spezifische Bedeutungen, die mit tatsächlichen Konzepten korrelieren. Manchmal werden mehrere Bedeutungen in ein einzelnes Schlüsselwort oder einen Wert überladen.

In C und C ++ , NULL, Falseund 0werden auf den gleichen Wert überlastet. In C # sind es 3 verschiedene Konzepte.

nulloder zeigt NULLnormalerweise einen Wertmangel an, gibt aber normalerweise nicht an, warum. 0gibt die natürliche Zahl Null an und hat eine Typäquivalenz zu 1, 2, 3 usw. und in Sprachen, die separate Konzepte unterstützen, NULLsollte nur eine Zahl behandelt werden.

Falsch bedeutet Nichtwahrheit. Und es wird in Binärwerten verwendet . Es bedeutet nicht, nicht gesetzt, noch bedeutet es0 . Es zeigt einfach einen von zwei Binärwerten an.

Nichts kann darauf hinweisen, dass der Wert speziell auf nichts festgelegt ist, was dasselbe wie null anzeigt, jedoch mit Absicht.

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

Orion Adrian
quelle
Interessant vielleicht, aber diskutiert PHP überhaupt nicht.
Brad
4

Ich habe gerade 1/2 einen verlorenen Tag versuchen zu bekommen entweder eine 0, null, falsezurück aus strops!

Hier ist alles, was ich versucht habe, bevor ich feststellte, dass die Logik nicht in die richtige Richtung floss und anscheinend ein Schwarzes Loch in der PHP-Codierung war:

Konzept nehmen Sie einen Domainnamen, der auf einem Server gehostet wird, und stellen Sie sicher, dass es sich nicht um Root-Ebene handelt.

Jedenfalls war hier die Grundlage der Entscheidung:

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 nach dem Lesen dieses Themas fand ich, dass dies funktioniert !!!

{
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 es, obwohl es Weihnachten ist, möglicherweise nicht Weihnachten ist false, da es auch ein NULLTag sein kann!

Nachdem ich einen Tag mit dem Debuggen eines einfachen Codes verschwendet hatte, wünschte ich mir, ich hätte das schon einmal gewusst, da ich das Problem hätte identifizieren können, anstatt überall herumzugehen und zu versuchen, es zum Laufen zu bringen. Es hat nicht funktioniert, wie False, NULLund 0sind nicht alle gleich , wie True or False or NULL?

madesignUK
quelle
2

Aus der PHP-Online-Dokumentation :

Verwenden Sie die Umwandlungen (bool) oder (boolean), um einen Wert explizit in einen Booleschen Wert umzuwandeln.
In den meisten Fällen ist die Umwandlung jedoch nicht erforderlich, da ein Wert automatisch konvertiert wird, wenn ein Operator, eine Funktion oder eine Steuerungsstruktur ein boolesches Argument erfordert.
Bei der Konvertierung in einen Booleschen Wert werden die folgenden Werte als FALSE betrachtet:

  • der Boolesche Wert FALSEselbst
  • die ganze Zahl `` 0 (Null)
  • der Schwimmer 0.0(Null)
  • die leere Zeichenfolge und die Zeichenfolge "0"
  • ein Array mit null Elementen
  • ein Objekt mit null Mitgliedsvariablen (nur PHP 4)
  • der spezielle Typ NULL(einschließlich nicht festgelegter Variablen)
  • SimpleXML-Objekte, die aus leeren Tags erstellt wurden
    Jeder andere Wert wird berücksichtigt TRUE(einschließlich aller Ressourcen).

In den meisten Fällen ist es also dasselbe.

Auf der anderen Seite sind das ===und das ==nicht dasselbe. Regelmäßig benötigen Sie nur den Operator "equals". 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 PHP-Online-Dokumenten.

Hoffe das hilft.

Javier Constanzo
quelle
1

Die Unterschiede zwischen diesen Werten sind immer auf detaillierte sprachspezifische Regeln zurückzuführen. Was Sie für PHP lernen, gilt nicht unbedingt für Python, Perl, C usw. Während es hilfreich ist, die Regeln für die Sprache (n) zu lernen, mit denen Sie arbeiten, ist es problematisch, sich zu sehr auf sie zu verlassen . Das Problem tritt auf, wenn der nächste Programmierer Ihren Code pflegen muss und Sie ein Konstrukt verwendet haben, das einige kleine Details von Null vs. False (zum Beispiel) ausnutzt. Ihr Code sollte korrekt aussehen (und umgekehrt sollte falscher Code falsch aussehen ).

Greg Hewgill
quelle
1

Null wird in Datenbanken verwendet, um "kein Datensatz" oder "keine Informationen" darzustellen. Möglicherweise haben Sie ein Bitfeld, das beschreibt, ob dieser Benutzer E-Mails von uns erhalten möchte. True bedeutet, dass dies der Fall ist. False bedeutet, dass er nichts senden möchte. Null bedeutet jedoch, dass Sie keine E-Mails senden 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 gleich nichts, also wenn (a == NULL) immer falsch ist.

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

Peter
quelle
1

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

Einer der häufigsten Fehler, den Entwickler machen, ist beispielsweise die Rückgabe von Fehlercode in Form von Daten mit einer Funktion.

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

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

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

Stattdessen ist es am besten, Fehlercode nicht mit Ihren Daten zu mischen. 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 Entwicklungsgeschäft ist, er oder sie wird dies niemals falsch verstehen. Hier geht es jedoch nicht um Redudanz oder Abhängigkeiten im Code.

Im Allgemeinen ist es in Ordnung, Bool als erstklassigen Typ in der Sprache zu tauschen, und ich denke, Joel hat in seinem letzten Postcast darüber gesprochen. Aber versuchen Sie nicht, Mix-and-Match-Bools mit Ihren Daten in Ihren Routinen zu verwenden, und Sie sollten vollkommen in Ordnung sein.

Tschad
quelle
1

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

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

Technisch gesehen ist null 0x00aber in PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 ist ein ganzzahliger Wert.

Gavin M. Roy
quelle
1

Eine interessante Tatsache NULLin PHP: Wenn Sie eine Variable gleich setzen, NULList es dasselbe, als hätten Sie es aufgerufen unset().

NULLbedeutet im Wesentlichen, dass einer Variablen kein Wert zugewiesen ist; falseBoolean - Wert ist ein gültiger, 0ist ein gültiger Integer - Wert, und PHP hat einige ziemlich hässlich Konvertierungen zwischen 0, "0", ""und false.

Dirtside
quelle
0

Null ist nichts, Falsch 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, dass 0 und false austauschbar sind, aber da Boolean ein tatsächlicher Typ ist, können Methoden und Objekte damit verknüpft werden, sodass dies nur ein Kompromiss ist. Null ist jedoch null, das Fehlen von irgendetwas im Wesentlichen.

CodeRedick
quelle
0

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

Die schnelle Antwort lautet also: Kontext.

Jasonmray
quelle
0

In so ziemlich allen modernen Sprachen bezieht sich null logisch 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, nun, false. Um die Sache zu komplizieren, werden in C beispielsweise null, 0 und false genau gleich dargestellt. Ich weiß nicht, wie es in PHP funktioniert.

Um die Sache noch komplizierter zu machen, haben Datenbanken das Konzept null, was bedeutet, dass sie fehlen oder nicht anwendbar sind, und die meisten Sprachen haben keine direkte Möglichkeit, eine DBNull ihrer Null zuzuordnen. Bis vor kurzem gab es zum Beispiel keinen Unterschied zwischen einem int null und null, aber das wurde mit nullbaren Ints geändert.

Tut mir leid, dass dies kompliziert klingt. Es ist nur so, dass dies seit Jahren ein heikler Knackpunkt in Sprachen ist, und bis vor kurzem hatte es nirgendwo eine klare Lösung. Die Leute pflegten nur Dinge zusammen zu klumpen oder Leerzeichen oder 0 zu machen, um Nullen in der Datenbank darzustellen, was nicht immer gut funktioniert.

Charles Graham
quelle
0

False und 0 sind konzeptionell ähnlich, dh sie sind isomorph. 0 ist der Anfangswert für die Algebra natürlicher Zahlen und False 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 hinzugefügt wird, dieselbe Zahl ergibt:

x + 0 = x

In ähnlicher Weise ist False ein Wert, bei dem eine Trennung von ihm und jedem anderen Wert denselben Wert hat:

x || False = x

Null ist konzeptionell etwas völlig anderes. Abhängig von der Sprache gibt es unterschiedliche Semantiken dafür, aber keine von ihnen beschreibt einen "Anfangswert" als Falsch und 0. Es gibt keine Algebra für Null. Es bezieht sich auf Variablen, normalerweise um anzuzeigen, 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" anstelle von "null", der ein Platzhalter für den Wert einer Berechnung ist, die nicht beendet wird.

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

Apocalisp
quelle
1
offtopic, false == 0 ist vollständig verzögert. Dies gilt umso mehr, wenn PHP Daten zurückgibt ODER eine Funktion ausfällt. Siehe die Rückgabe für mysql_insert_id. "" Die ID, die von der vorherigen Abfrage bei Erfolg für eine AUTO_INCREMENT-Spalte generiert wurde, 0, wenn die vorherige Abfrage keinen AUTO_INCREMENT-Wert generiert, oder FALSE, wenn keine MySQL-Verbindung hergestellt wurde. "" Grundsätzlich kann A) die ID zurückgegeben werden. B) Null, C) Falsch ... Wenn dies nun das erste Element in der Tabelle ist, ist ID Null! also sind alle drei Werte gleich! Wie kann der Entwickler drei Arten von Nullen verstehen? ... und ich stimme Ihrem Beitrag auf null zu.
GCB
0

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

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!
vladzur
quelle
1
Weil PHP intern in den Integer-Typ umwandelt und dann vergleicht. php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)siehe php.net/manual/en/language.operators.comparison.php Übersetzen Sie Zeichenfolgen und Ressourcen in Zahlen, übliche Mathematik
Sevyls
-1

Die Probleme mit der Falschheit stammen aus der PHP-Geschichte. Das Problem zielt auf den nicht genau definierten Skalartyp ab.

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

Die Strenge von PHP7 ist ein Schritt nach vorne, aber vielleicht nicht genug. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

Adrian
quelle