Frage

Man hat mir gesagt, dass gute Entwickler kann den Unterschied zwischen Null und False und 0 und alle anderen gut „nichts“ Einheiten vor Ort / nutzen.
Was ist der Unterschied, speziell in PHP? Hat es etwas mit === zu tun?

War es hilfreich?

Lösung

Es ist sprachspezifisch, sondern in PHP:

Null bedeutet " nichts ". Die var nicht initialisiert wurde.

False bedeutet " in einem Booleschen Kontext nicht wahr ". Verwendet explizit zeigen Sie mit logischen Problemen zu tun hat.

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

Nun, was heikel ist, ist es, dass in dynamischen Sprachen wie PHP, alle von ihnen in einem Booleschen Kontext einen Wert , die (in PHP) ist False.

Wenn Sie es mit == testen, wird es den Booleschen Wert zu testen, so dass Sie Gleichheit erhalten. Wenn Sie es mit === testen, wird es die Art testen, und Sie werden Ungleichheit erhalten.

Warum sind sie nützlich?

Nun, sehen Sie die strrpos() Funktion. Es gibt False zurück, wenn es nicht etwas gefunden haben, aber 0, wenn es etwas am Anfang der Zeichenfolge

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

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

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

Sie mögen einen Unterschied zwischen DebugMode = False (auf OFF) machen, DebugMode = True (eingestellt) angegeben und DebugMode = Null (nicht gesetzt, wird zu hart Debuggen führen; -)).

Andere Tipps

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

es gibt nicht viel Konsistenz in PHP. die Entwickler TRY auf null bedeutet "unkown" oder "nicht existent" zu machen. aber oft falsch dienen als 'nicht existent' (z strrpos ( 'nicht bestanden', 'Suche') gibt false zurück, und nicht null)

Sie werden oft null sehen verwendet werden, wenn sie bereits falsch verwenden für etwas. z.B. filter_input (). Sie return false, wenn die Variable den Filter ausfällt. und null, wenn die Variable nicht existiert (nicht vorhanden nicht bedeutet, dass es auch die Filter versagt? warum also auch null zurück?!?)

php hat die Bequemlichkeit der Daten in den Funktionen zurück. und ofter die Entwickler stopfen in allen Arten von Fehlerstatus anstelle der Daten.

Und es gibt keine vernünftige Art und Weise in PHP Daten zu erfassen (int, str, usw.) von Ausfall (false, null)

Sie haben ziemlich viel zu immer testen === null oder === falsch, abhängig von der Funktion. oder für beide, in Fällen wie filter_input () / filter_var ()

und hier ist etwas Spaß mit Typ-Jonglieren. einschließlich Arrays und Objekte nicht einmal.

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)

Im Folgenden finden Sie 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 beachten Sie dies für weitere Referenz von Typ Vergleiche in PHP. Es sollte Ihnen ein klares Verständnis geben.

In PHP können Sie verwenden === und! == Betreiber nicht nur zu prüfen, ob die Werte gleich sind, sondern auch, wenn ihre Typen entsprechen. So zum Beispiel: 0 == false ist true, aber 0 === false ist false. Das gleiche gilt für != gegen !==. Auch im Fall, dass Sie null zu den beiden anderen mit den genannten Operatoren vergleichen, erwarten ähnliche Ergebnisse.

Nun ist diese Qualität der Werte in PHP in der Regel verwendet wird, wenn ein Wert zurückgegeben wird, die manchmal 0 werden kann (Null), aber manchmal kann es sein, dass die Funktion fehlgeschlagen. In solchen Fällen, in PHP zurückkehren Sie false und Sie haben für diese Fälle mit dem Identitätsoperator === zu überprüfen. Zum Beispiel, wenn Sie für eine Position einer Zeichenfolge innerhalb des anderen suchen und Sie verwenden strpos(), wird diese Funktion die numerische Position zurück, die 0 sein kann, wenn die Zeichenfolge am Anfang gefunden wird, aber wenn die Zeichenfolge nicht gefunden werden überhaupt, dann wird strpos() false zurückkehren und Sie haben dies zu berücksichtigen, wenn sie mit dem Ergebnis zu tun.

Wenn Sie die gleiche Technik in Ihren Funktionen verwenden, jemand vertraut mit der Standard-PHP-Bibliothek wird verstehen, was los ist und wie Sie überprüfen, ob der zurückgegebene Wert ist, was gewünscht wird oder einen Fehler auftritt, hat bei der Verarbeitung. Das gleiche gilt eigentlich für die Funktion params, können Sie sie unterschiedlich, je nachdem verarbeiten können, wenn sie Arrays oder Strings oder was nicht, und diese Technik überall in PHP zu stark verwendet wird, damit jeder es ganz leicht. Also ich denke, das ist die Macht.

False, Null, Nichts, 0, undefinierte , usw., usw.

Jeder von ihnen hat eine bestimmte Bedeutung, die mit tatsächlichen Konzepte korrelieren. Manchmal werden mehrere Bedeutungen überlasten in ein einzelnes Stichwort oder Wert.

C und C ++ , NULL, False und 0 werden auf den gleichen Wert überlasten. In C # , sie sind 3 verschiedene Konzepte.

null oder NULL zeigt in der Regel einen Mangel an Wert, aber in der Regel nicht, warum nicht angibt. 0 gibt die natürliche Zahl Null und hat Typ-Äquivalenz zu 1, 2, 3, usw. und in Sprachen, die separaten Konzepte von NULL unterstützen sollte nur eine Nummer behandelt werden.

False zeigt nicht die Wahrheit. Und es verwendet in binäre Werte . Es bedeutet nicht, ungesetzt, noch bedeutet es, 0. Es gibt lediglich eine von zwei binären Werten.

Nichts kann zeigen, dass der Wert speziell entwickelt, um nichts festgelegt ist, die die gleiche Sache wie null zeigt an, aber mit Absicht.

Nicht definiert in einigen Sprachen gibt an, dass der Wert noch eingestellt werden muss, weil kein Code einen Ist-Wert angegeben hat.

Ich habe gerade 1/2 versucht ein verlorener Tag entweder eine 0, null zu bekommen, false von strops zurück!

Hier ist alles, was ich zu tun versuche, bevor ich fand, dass die Logik nicht in der richtigen Richtung fließt, und schien, dass es eine Blackhole- in PHP-Programmierung war:

Konzept nehmen einen Domain-Namen auf einem Server gehostet, und stellen Sie sicher, dass es nicht Root-Ebene ist, OK mehrere verschiedene Wege, dies zu tun, aber ich wählte andere aufgrund anderer PHP-Funktionen / Konstrukte ich getan habe.

Wie auch immer hier war die Grundlage des cosing:

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 diesem Thema zu lesen, Ich fand, 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, obwohl es Weihnachten ist, ist es nicht Weihnachten als false sein kann, wie es ist auch ein NULL Tag sein!

Nach einem Tag des Debuggen einige einfache Code verschwenden, wollte ich das vorher gewusst hätte, wie ich in der Lage gewesen wäre, das Problem zu identifizieren, anstatt alle über dem Platz versuchen, es an die Arbeit. Es hat nicht funktioniert, wie False, NULL und 0 sind nicht alle gleich, wie True or False or NULL?

Von der PHP Online-Dokumentation :

  

explizit Um einen Wert zu konvertieren boolean, verwenden Sie die (bool) oder (boolean) wirft.
  In den meisten Fällen ist jedoch die Besetzung unncecessary, da wird ein Wert automatisch, wenn ein Operator, eine Funktion oder eine Kontrollstruktur ein boolean Argument erfordert umgewandelt werden.
  Wenn die Umwandlung nach boolean werden folgende Werte als FALSE:

  • die boolean FALSE selbst
  • die ganze Zahl `` 0 (null)
  • der Schwimmer 0.0 (null)
  • die leere Zeichenkette und die Zeichenkette "0"
  • ein Array mit Null-Elementen
  • ein Objekt mit Null Elementvariablen (PHP 4 nur)
  • der spezielle Typ NULL (einschließlich nicht definierter Variablen)
  • SimpleXML Objekte von leeren Tags erstellt
    Jeder andere Wert wird als TRUE (einschließlich Ressource).

Also, in den meisten Fällen ist es das gleiche.

Auf der anderen Seite, die === und die ==are nicht das Gleiche. Regelmäßig müssen Sie nur den „Gleichen“ Operator. Zur Klarstellung:

$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. 

Für weitere Informationen besuchen Sie das „ Vergleichsoperatoren "Seite in der Online-Dokumentation PHP.

Hope, das hilft.

Die Unterschiede zwischen diesen Werten kommen immer detaillierte sprachspezifische Regeln nach unten. Was Sie lernen für PHP ist nicht unbedingt wahr für Python oder Perl oder C, usw. Während es ist wertvoll, die Regeln für die Sprache (n), die Sie gerade arbeiten, die sich auf ihnen zu lernen ist zu viel Ärger bringen . Das Problem kommt, wenn der nächste Programmierer muss Ihren Code erhalten und Sie einig Konstrukt verwendet haben, in welchen einig kleinen Detail von Null vs. False (zum Beispiel) erfolgt. Der Code sollte korrekt aussehen (und umgekehrt, falscher Code sollte falsch aussehen).

Null ist in Datenbanken, um „keine Aufzeichnung“ oder „keine Information“ verwendet. So können Sie ein Bit-Feld haben, das „tut dieser Benutzer möchte, dass sie per E-Mail von uns“ beschreibt, wo True bedeutet, sie tun, False bedeutet, sie wollen nichts gesendet werden, aber Null würde bedeuten, dass Sie don‘ t wissen. Sie können über kommen durch Outer-Joins und ähnliches.

Die logischen Auswirkungen von Nullen sind oft anders -. In einigen Sprachen ist NULL nicht gleich alles, also wenn (a == NULL) immer falsch sein

So persönlich würde ich immer einen Booleschen auf FALSCH initialisiert, und ein auf NULL initialisiert würde ein bisschen eklig (auch in C, wo die beiden sind beide nur 0 ... nur ein Stil Sache) suchen.

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

Zum Beispiel, einer der häufigsten Fehler, die Entwickler machen ist Fehlercode in Form von Daten mit einer Funktion zurückzukehren.

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

Dies ist ein Beispiel für eine Zucker Schnittstelle. Dies wird in dem Buch „debug die Software-Entwicklung proccess“ und auch in einem anderen Buch „Schreiben richtigen Code“ exsplained.

Das Problem dabei ist die Implikation oder Annahmen über den char-Typen gemacht. Auf einigen Compiler kann der Typ char nicht signiert sein. Also auch wenn Sie eine Rückkehr -1 der Compiler 1 statt zurückgeben kann. Diese Art von Compiler Annahmen in C ++ oder C ist schwer zu erkennen.

Stattdessen ist der beste Weg, nicht Fehlercode mit Ihren Daten zu mischen. So ist die folgende Funktion.

char GetChar()

Jetzt wird

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

Das bedeutet, egal wie jung der Entwickler in dem Entwicklungsgeschäft ist, er oder sie wird nie so falsch. Obwohl dies spricht nicht über redudancy oder dependies im Code.

So in der Regel in der Sprache bool als erste Klasse Typ Swapping ist in Ordnung, und ich denke, joel darüber mit seiner jüngsten Postcast sprach. Aber versuchen Sie nicht, Mix and Match bools mit Ihren Daten in Ihren Routinen zu verwenden, und Sie sollten völlig in Ordnung sein.

In PHP es hängt 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 Integer-Wert.

Eine interessante Tatsache über NULL in PHP:. Wenn Sie eine var gleich NULL gesetzt, es ist das gleiche wie wenn Sie unset() sie aufgefordert hatte,

NULL bedeutet im Wesentlichen eine Variable keinen Wert zugewiesen hat; false ist ein gültiger boolescher Wert, 0 ist ein gültiger Integer-Wert, und PHP hat einige ziemlich hässlich Konvertierungen zwischen 0, "0", "" und false.

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

Nicht ein PHP-Experte, aber in einigen der neueren Sprachen diejenigen sind nicht austauschbar. Ich vermisse Art mit 0 und falsch austauschbar sein, aber mit boolean eine tatsächliche Art ist, können Sie Methoden und Objekte mit ihm verbunden, so dass nur ein Kompromiss. Null ist Null, obwohl das Fehlen von irgendetwas im Wesentlichen.

Nun, ich kann nicht genug daran erinnern, von meinen PHP Tagen den „===“ Teil zu beantworten, aber für die meisten C-Stil Sprachen, NULL sollte im Zusammenhang mit dem Zeigerwert verwendet werden, falsch als boolean, und Null als numerischer Wert, wie ein int. ‚\ 0‘ ist der üblicher Wert für ein Zeichen Kontext. Ich ziehe es in der Regel auch 0.0 für floats und doubles zu verwenden.

So .. die schnelle Antwort ist:. Kontext

In so ziemlich alle modernen Sprachen, null logisch bezieht sich auf Zeiger (oder Referenzen) einen Wert aufweist, oder eine Variable, die nicht initialisiert wird. 0 ist der ganzzahlige Wert von Null, und falsch ist der Boolesche Wert, gut false. Um die Dinge komplizieren, in C, zum Beispiel, null, 0, und falsch vertreten sind genau die gleiche Art und Weise. Ich weiß nicht, wie es in PHP funktioniert.

Dann zu erschweren Dinge mehr, haben Datenbanken ein Konzept von Null, was bedeutet, oder nicht anwendbar fehlen, und die meisten Sprachen haben keinen direkten Weg, um einen DBNull ihrer null abzubilden. Bis vor kurzem zum Beispiel gab es keinen Unterschied zwischen einem int ist null und Null ist, aber das wurde mit NULL festlegbare Ints geändert.

Leider diesen Sound kompliziert zu machen. Es ist nur so, dass dies einen harry Knackpunkt in Sprachen seit Jahren, und bis vor kurzem hat es keine klare Auflösung überall hat. Menschen verwendet, um die Dinge nur Flickschusterei zusammen oder machen leer oder 0 darstellen Nullen in der Datenbank, die nicht immer zu gut funktioniert.

False und 0 sind vom Konzept her ähnlich, das heißt 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 Anzahl definiert werden, die, wenn sie auf eine natürliche Zahl hinzugefügt, ergibt, dass gleiche Zahl:

x + 0 = x

In ähnlicher Weise Falsch ist ein Wert, so dass eine Trennung von ihm und jedem anderen Wert, die gleichen Wert:

x || False = x

Null ist vom Konzept her etwas ganz anderes. Je nach Sprache, gibt es unterschiedliche Semantik für sie, aber keiner von ihnen beschreibt einen „Anfangswert“ als falsch und 0 sind. Es gibt keine Algebra für Null. Es bezieht sich auf Variablen, in der Regel zu bezeichnen, dass die Variable im aktuellen Kontext keinen spezifischen Wert hat. In den meisten Sprachen gibt es keine Operationen auf Null festgelegt, und es ist ein Fehler Null als Operand zu verwenden. In einigen Sprachen gibt es einen speziellen Wert „unten“ und nicht als „null“ genannt, der ein Platzhalter für den Wert einer Berechnung, die nicht beendet.

ich geschrieben habe mehr ausführlich über die Auswirkungen der NULL an anderer Stelle.

Jemand kann mir erklären, warum ‚NULL‘ nicht nur eine Zeichenfolge in einer Vergleich Instanz ist?

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

Die Probleme mit falsyness kommen aus der PHP-Geschichte. Das Problem zielt auf die nicht gut definiert skalaren Typ.

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

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

PHP7 Strikt ist ein Schritt nach vorn, aber vielleicht nicht genug. https://web-techno.net/typing -mit-php-7-what-you-shouldnt-do /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top