Hallo,
Manches ist mir nicht so klar, daher mal meine Bitte ob jemand mal meine Erklärungsversuche durchsieht oder genaue Infos dazu gibt.
schau'mer mal ... :-)
$x = "08"; $y = 08; $z = "47"; $x += 15; $y += "15"; $z += 11; echo $x $y $z;
Liefert als Ergebnis:
231558
Ist das so weil:
Der Wert 23 bei $x weil PHP den String "08" automatisch als Zahl 8 erkennt und 8 + 15 = 23 ist?
Ja.
Der Wert 15 bei $y weil PHP die Zahl 08 als 0 interpretiert und daher Gesamt = 15 ergibt?
Ja. Hier ist es etwas gemeiner: Zahlen, die mit einer führenden Null notiert werden, interpretiert PHP als Oktalzahlen. Aber eigentlich würde ich bei der Zuweisung $y = 08; schon einen Syntaxfehler erwarten, weil es im Oktalsystem keine Ziffer 8 gibt.
Der wert 58 bei $z weil PHP den String "47" als Zahl 47 interpretiert und + 11 dann 58 ergibt?
Ja. Identisch mit dem ersten Fall.
define ('CONSTANT', 1); define ('_CONSTANT', 0); define ('EMPTY', ''); if (!empty(EMPTY)) { //hier erster Syntax Error if (!(boolean) _CONSTANT)) { // wirft auch einen Fehler print "One"; } } else if (constant('CONSTANT') == 1) { print "Two"; }
Kommt der erste Fehler weil empty() nur bei Variablen geht?
Ja, korrekt.
Wenn man dann aber den Code ändert nach if (EMPTY == "")) { ..passt es trotzdem nicht?
Weil EMPTY ein geschützter Begriff ist?
Nicht exakt ein geschützter Begriff - aber bei Funktionen und funktions-ähnlichen Konstrukten ist PHP nicht case-sensitive. Der Bezeichner EMPTY wäre daher identisch mit der Pseudofunktion empty().
Was passt PHP an dieser Zeile nicht?
if (!(boolean) _CONSTANT)) {
Kann ich auf Anhieb nicht sagen.
> $x = (bool) " " * (int) (string) 12E-1;
> echo $x;
Ergibt 1 aber warum?
Mal langsam. Also: 12E-1 ist normalisiert 1.2, also steht da (string) 1.2, und das ergibt den String "1.2". Dann ein Typecasr nach int, und man erhält 1. Der zweite Faktor der Multiplikation ist also 1. Davor steht (bool) " ", und ein nicht-leerer String ergibt im boolschen Kontext true, also 1.
Was macht denn überhaupt (string) 12E-1
Es wandelt den float-Zahlenwert in einen String um.
und wofür steht 12E-1 ?
Das ist die wissenschatliche Notation und steht als Abkürzung für 12 * 10⁻¹, aber üblicherweise normalisiert man die Darstellung dann so, dass die Mantisse im Bereich [1.0 .. 10.0[ liegt. Also ist der Ausdruck gleichwertig mit 1.2 * 10⁰.
Wenn man nur echo (string) 12E-1 eingibt kommt 1,2 zu Stande
Eben. qed. :-)
$p = "PHP"; $P = "php"; echo ($p < $P) + 2 * ($p > $P) + 3 * ($p == $P);
Das ergibt 1.
echo ($p < $P) ; ergibt 1 aber warum? wäre doch wie PHP ist kleiner php. Wird hier nach Groß Kleinschreibung verglichen?
Exakt. Es wird Zeichen für Zeichen verglichen, und "P" hat den Code 0x50, "p" den Code 0x70. Groß- und Kleinbuchstaben sind einfach verschiedene Zeichen, und die Großbuchstaben kommen in der Codetabelle zuerst.
echo ($p > $P) ergibt "Leer" aber warum?
Was meinst du mit "Leer"? Nein, das sollte false ergeben, also numerisch interpretiert 0.
und ($p == $P); ist vermutlich false
Ja.
Wie muss man dann obiges Konstrukt lesen? Etwa so?
3 * false ist 0 plus 2 + Leer ist 0 plus 1 von ($p < $P) ist dann als Ergebnis 1 ?
Ja, nur dass ich mit dem "Leer" nicht einverstanden bin und da auch false erwarten würde.
$str = 'abcdef'; if (strpos($str, 'a')) { echo "Zeichen 'a' gefunden"; } else { echo "Buchstabe 'a' wurde nicht gefunden"; }
Warum wird hier immer in den Else Zweig gesprungen?
Weil das Zeichen a am Anfang vom String steht und daher 0 liefert ?
Genau, und 0 ist, als boolscher Wert interpretiert, false. Also ist die Bedinung nicht erfüllt. Bei solchen Funktionen, die 0 als gültigen Wert zurückgeben können, muss man höllisch aufpassen. Am besten ist in so einem Fall, typsicher zu vergleichen:
$str = 'abcdef'; if (strpos($str, 'a')!==false) { echo "Zeichen 'a' gefunden"; } else { echo "Buchstabe 'a' wurde nicht gefunden"; }
Der Operator !== bewirkt hier einen exakten Vergleich, bei dem keine automatische Typumwandlung stattfindet.
So long,
Martin
Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
- Douglas Adams, The Hitchhiker's Guide To The Galaxy