2010-03-04 15 views
34

Ich frage mich, wie PHP richtig/falsch Vergleich intern behandelt. Ich verstehe, dass wahr als 1 definiert ist und falsch als 0 definiert ist. Wenn ich tun if("a"){ echo "true";} es Echos "True". Wie erkennt PHP "a" als 1?Wie funktioniert True/False in PHP?

+2

Es ist zu simpel zu sagen, dass "wahr ist definiert als 1 und falsch ist definiert als 0". –

+1

übrigens.Raten Sie, was das zurückgibt: "false" == true –

Antwort

71

Dies ist in der PHP-Dokumentation für booleans und type comparison tables abgedeckt.

Wenn zu boolean Umwandlung werden die folgenden Werte in Betracht gezogen FALSE:

  • die Boolesche FALSE selbst
  • die ganze Zahl 0 (Null)
  • der Schwimmer 0.0 (Null)
  • die leere Zeichenfolge und die Zeichenfolge '0'
  • ein Array mit Null-Elemente
  • ein Objekt mit Nullelementvariablen (PHP 4 nur)
  • der spezielle Typ NULL (einschließlich nicht definierter Variablen)
  • SimpleXML Objekte aus leeren Tags erstellt

Jeder andere Wert wird als wahr betrachtet.

+1

Tatsächlich gibt es zahlreiche Werte, die in false konvertiert werden, einschließlich leere Arrays und null. Oder beziehst du dich nur auf Saiten? – sidereal

+1

@sidereal: Ich habe jetzt den ganzen Auszug gepostet. Drücken Sie auf Aktualisieren. ;-) –

+0

ist nicht die übliche Konvention 'jeder andere Wert als 0 gilt als FALSCH' ?? wie in der Linux-Shell. Ich fange an, das Vertrauen in die Programmierer Community zu verlieren – Blauhirn

5

Null ist falsch, nicht null ist wahr.

In PHP können Sie expliziter testen mit dem === Operator.

if (0==false) 
    echo "works"; // will echo works 

if (0===false) 
    echo "works"; // will not echo anything 
+0

Warum '0 === false' wird nicht funktionieren? Gibt es auch einen Unterschied zwischen '0 === false' und' 0 === FALSE'? – JavaSa

+0

Es besteht kein Unterschied zwischen '0 === false' und' 0 === FALSE'. Beide Falschen bewerten denselben Wert; Für Funktionsnamen und Sprachschlüsselwörter ist PHP, obszön, ohne Berücksichtigung der Groß-/Kleinschreibung. Beide "arbeiten", aber sie bewerten zu falsch, weil "===" tatsächlich eine typabhängige Wertüberprüfung durchführt. '==' erlaubt Überprüfungen zwischen Typen; Sehen Sie sich die akzeptierte Antwort zu diesem Thema an, wie PHP bestimmt, was mit false übereinstimmt und was nicht. – kungphu

1

PHP verwendet schwache Typisierung (die es 'Typ Jonglieren' nennt), was eine schlechte Idee ist (obwohl das eine Konversation für ein anderes Mal ist). Wenn Sie versuchen, eine Variable in einem Kontext zu verwenden, die einen Booleschen erfordert, wird es konvertieren, was auch immer Ihre Variable in einen boolean ist, nach einigen meist willkürlichen Regeln finden Sie hier: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

+5

Diese "schlechte Idee" ist rein subjektiv: Wer einmal weiß, wie das funktioniert, ist meiner Meinung nach absolut kein Problem ;-) ;; und die Konvertierungsregeln scheinen mir meist nicht ganz unlogisch ;-) –

+1

Lass mich nicht eine Stackoverflow-Frage posten, wie schlecht eine Idee schwach tippen ist;). Beachten Sie, dass php es schafft, einen grundlegenden Syllogismus zum Scheitern zu bringen, da implizite Typumwandlungen dazu führen, dass php equality nicht transitiv wird: echo ("true" == true). "\ N"; // true echo (wahr == 1). "\ n"; // true echo ("wahr" == 1). "\ n"; // false: P – sidereal

+1

Ja ... es ist ein (potentiell) sehr gefährlicher Trick für neue Spieler, aber nicht unbedingt eine schlechte Idee. Ich werde hier nicht die Robustheit des Codes verteidigen, aber manchmal ist es eine nette Abkürzung. Außerdem, wenn Sie viel größere Arbeit machen, werden Sie wahrscheinlich die meiste Zeit Gleichheitsmethoden verwenden. – spronkey

0

denken an Betreiber als einstellige Funktion: is_false(type value) die Gibt True oder False zurück, abhängig von der genauen Implementierung für bestimmte Typen und Werte. Überlegen Sie, ob eine Anweisung diese Funktion implizit über syntaktischen Zucker aufrufen soll.

Eine andere Möglichkeit ist, dass der Typ den Operator cast hat, der den Typ implizit in einen anderen Typ umwandelt, in diesem Fall string to Boolean.

PHP stellt solche Details nicht zur Verfügung, aber C++ erlaubt eine Überlastung des Operators, die feine Details der Operatorimplementierung aufdeckt.

3

der beste Antrieb für strenge Kontrolle ist

if($foo === true){} 

Auf diese Weise sind Sie wirklich, wenn sein wahre Prüfung, und nicht 1 oder einfach nur festgelegt.