(MENSCHELEI) Die Wahrheit feierte Geburtstag
Cheatah
- php
0 dedlfix
Hi,
soeben überraschte mich PHP im Umgang mit Datentypen. Ich hatte folgenden Code:
if ($debug) { tuwas(); }
Die Variable $debug wurde auf Basis eines URL-Parameters erzeugt, wobei automatisch nummerische und boole'sche Werte erkannt und umgewandelt werden. Somit entspricht der URL-Parameter "debug=true" einer Zuweisung "$debug=true", nicht "$debug='true'".
Nun ja. Nachdem mir eine boole'sche Unterscheidung nicht mehr reichte, habe ich einen nummerischen Debug-Level eingeführt und den Code erweitert:
if ($debug > 100) { tuwas(); }
Und siehe da, auch mit "debug=true" wurde tuwas() aufgerufen. Verwundert prüfte ich, ob meine Umwandlung korrekt war:
if (true > 100) { tuwas(); }
Et voilà, die Wahrheit ist schon über hundert. Wer hätte das gedacht. Nun, ich habe viel gelernt, der Fix ("if ((int)$debug > 100)") war schnell gefunden, aber die Stelle, wo dies dokumentiert ist, suche ich noch immer vergebens. Übrigens ist (int)true===1.
Chea "Das war mein schönstes Ferienerlebnis." tah, sich brav verbeugend und von dannen ziehend
echo $begrüßung;
Et voilà, die Wahrheit ist schon über hundert. Wer hätte das gedacht. [...] die Stelle, wo dies dokumentiert ist, suche ich noch immer vergebens.
Du machst sicher irgendwas verkehrt, denn das Phänomen kann ich nicht nachvollziehen:
$debug = true;
var_dump($debug > 100);
$debug = 'true';
var_dump($debug > 100);
var_dump(true > 100);
ergibt unter PHP 5.2.5 3× bool(false)
Übrigens ist (int)true===1.
Teste doch sowas lieber mit var_dump((int)true). Das gibt dir direkt eine Ausgabe des Inhalts, ohne dass da noch irgendeine PHP-Spezialität zuschlägt.
echo "$verabschiedung $name";
Hi,
Du machst sicher irgendwas verkehrt, denn das Phänomen kann ich nicht nachvollziehen:
ich verrate Dir, was ich nicht nachvollziehen kann: nämlich warum ich Code-Stücke, die ich dann auch noch mit Copy&Paste weiter verbreite, nicht genauer prüfe. Der Vergleich lautete auf "$debug >= 100"[1], was gevardumpt auch tatsächlich true ergibt. Unabhängig vom Zahlenwert übrigens.
Übrigens ist (int)true===1.
Teste doch sowas lieber mit var_dump((int)true). Das gibt dir direkt eine Ausgabe des Inhalts, ohne dass da noch irgendeine PHP-Spezialität zuschlägt.
Danke, das ist mir bekannt :-)
Cheatah
[1] Genauer gesagt enthielt mein Code kein "$debug", sondern einen komplexeren Ausdruck, was aber keine Rolle spielte, wie ein Test ergab.
echo $begrüßung;
Der Vergleich lautete auf "$debug >= 100", was gevardumpt auch tatsächlich true ergibt. Unabhängig vom Zahlenwert übrigens.
Na dann ist das kein Wunder mehr, denn alles was nicht 0, 0.0, '0', null, array(), false oder '' ist, ist true. Außerdem ist true > 0, weswegen sogar dein letzter Satz wahr ist.
Beschrieben ist das im Kapitel Types, genauer gesagt: Booleans. Und dann gibt es noch die PHP type comparison tables.
Zusatzfrage: Was ist der Wert von $x und warum?
$foo = 'foo';
$x = $foo['bar'];
echo "$verabschiedung $name";
Hi,
Der Vergleich lautete auf "$debug >= 100", was gevardumpt auch tatsächlich true ergibt. Unabhängig vom Zahlenwert übrigens.
Na dann ist das kein Wunder mehr, denn alles was nicht 0, 0.0, '0', null, array(), false oder '' ist, ist true. Außerdem ist true > 0, weswegen sogar dein letzter Satz wahr ist.
schon, nur hat mich der Typecast von int zu bool dann doch etwas überrascht - wenigstens bei diesem Operator.
Zusatzfrage: Was ist der Wert von $x und warum?
Ich vermute mal, hier wird ein Typecast nach int geschehen, weil ein String nur über nummerische Indizes verfügt. Demnach müsste das Ergebnis ein "f" sein, da 'bar' nicht mit einer Zahl beginnt und somit der Cast 0 ergibt.
Cheatah
echo $begrüßung;
Zusatzfrage: Was ist der Wert von $x und warum?
Ich vermute mal, hier wird ein Typecast nach int geschehen, weil ein String nur über nummerische Indizes verfügt. Demnach müsste das Ergebnis ein "f" sein, da 'bar' nicht mit einer Zahl beginnt und somit der Cast 0 ergibt.
Stimmt. Das ist ein recht gemeiner Fehler, besonders dann, wenn man seinen Irrtum, man hätte in $foo ein Array abgelegt, noch nicht bemerkt hat. Dieses Konstrukt liefert ja nicht mal die leiseste Meldung.
(Die mittlerweile zugelassene Schreibweise "nummerisch" beißt sich irgendwie mit der mir geläufigen (Schreib- und) Sprechweise numerisch mit Betonung auf dem e.)
echo "$verabschiedung $name";
Sup!
(Die mittlerweile zugelassene Schreibweise "nummerisch" beißt sich irgendwie mit der mir geläufigen (Schreib- und) Sprechweise numerisch mit Betonung auf dem e.)
Ja, die idiotischen Sprachvereinfachungen gehen mir auch auf den Sack. Was ich auch nie begreifen werde ist, warum man die eigene Sprache vereinfacht, aber gleichzeitig z.B. "Englisch ab der dritten Klasse" propagiert.
Wie sollen die Kinderchen dann jemals verstehen, dass im Englischen red, head und dad ganz ähnlich ausgesprochen werden, aber nicht heat und head, aber heat und seed...
Gruesse,
Bio
hi $name,
Wie sollen die Kinderchen dann jemals verstehen, dass im Englischen red, head und dad ganz ähnlich ausgesprochen werden, aber nicht heat und head, aber heat und seed...
die kleinen rotznasen begreifen das schon, ich hatte in der dritten klasse englisch, war toll.
gruss
shadow