Mir wurde gesagt , dass gute Entwickler kann den Unterschied zwischen Kassa- / nutzen Null
und False
und 0
und alle anderen gut „nichts“ Entitäten.
Was ist der Unterschied, speziell in PHP? Hat es etwas damit zu tun ===
?
Mir wurde gesagt , dass gute Entwickler kann den Unterschied zwischen Kassa- / nutzen Null
und False
und 0
und alle anderen gut „nichts“ Entitäten.
Was ist der Unterschied, speziell in PHP? Hat es etwas damit zu tun ===
?
Antworten:
Null
bedeutet " nichts ". Die Variable wurde nicht initialisiert.
False
bedeutet " nicht wahr in einem booleschen Kontext ". Wird verwendet, um explizit zu zeigen, dass Sie sich mit logischen Problemen befassen.
0
ist 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.
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 ;-)).
null
ist null
. false
ist 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)
var_dump( null == 0 );
.
0 == null
und null == []
, aber [] != 0
!!
strrpos('fail', 'search') will return false, and not null
Meiner Meinung nach ist das richtig - wenn die null
Mittel unbekannt sind strrpos
, null
wü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".
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.
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 == false
ist true
, aber 0 === false
ist false
. Das gleiche gilt für !=
versus !==
. null
Erwarten 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 false
Sie 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 false
und 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.
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
, False
und 0
werden auf den gleichen Wert überlastet. In C # sind es 3 verschiedene Konzepte.
null
oder zeigt NULL
normalerweise einen Wertmangel an, gibt aber normalerweise nicht an, warum.
0
gibt die natürliche Zahl Null an und hat eine Typäquivalenz zu 1, 2, 3 usw. und in Sprachen, die separate Konzepte unterstützen, NULL
sollte 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.
Ich habe gerade 1/2 einen verlorenen Tag versuchen zu bekommen entweder eine 0
, null
, false
zurü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 NULL
Tag 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
, NULL
und 0
sind nicht alle gleich , wie True or False or NULL
?
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:
FALSE
selbst 0.0
(Null) "0"
NULL
(einschließlich nicht festgelegter Variablen) 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.
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 ).
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).
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.
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 0x00
aber in PHP ( null == 0x00 ) && ( null !== 0x00 )
.
0
ist ein ganzzahliger Wert.
Eine interessante Tatsache NULL
in PHP: Wenn Sie eine Variable gleich setzen, NULL
ist es dasselbe, als hätten Sie es aufgerufen unset()
.
NULL
bedeutet im Wesentlichen, dass einer Variablen kein Wert zugewiesen ist; false
Boolean - Wert ist ein gültiger, 0
ist ein gültiger Integer - Wert, und PHP hat einige ziemlich hässlich Konvertierungen zwischen 0
, "0"
, ""
und false
.
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.
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.
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.
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.
Jemand kann mir erklären, warum 'NULL' nicht nur eine Zeichenfolge in einer Vergleichsinstanz ist?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
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
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/
null
und wann Sie verwendenfalse
. Ich ziehe mit ,null
wenn einen Wert von einer Methode abrufen, weil ich verwenden kann ,isset
um zu bestimmen , ob ein Wert anstelle der Verwendung zurückgeführt wird ,empty
die 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.