2012-08-16 8 views
6

Ich begann schon vor langer Zeit nicht zu PHP lernen, und ich in diese Frage lautete:PHP Verkettung von Strings und arithmetischen Operationen

<?php 

$a = 1; 
$b = 2; 

echo "$a * $b = " . $a * $b; 
echo "<br />"; 

echo "$a/$b = " . $a/$b; 
echo "<br />"; 

echo "$a + $b = " . $a + $b; 
echo "<br />"; 

echo "$a - $b = " . $a - $b; 
echo "<br />"; 

ich die folgende Ausgabe:

1 * 2 = 2 
1/2 = 0.5 
3 
-1 

Die letzten beiden Zeilen in die Ausgabe ist nicht das, was ich erwarten würde.

Warum ist das? Wie werden diese Ausdrücke bewertet? Ich versuche, die Sprache besser zu verstehen.

+0

Als allgemeine Richtlinie sollten Sie sich wahrscheinlich nicht auf die schwache Schreibweise von PHP verlassen. –

Antwort

8

Dies passiert, weil der Verkettungsoperator higher precedence als die Additions- oder Subtraktionsoperatoren hat, aber Multiplikation und Division haben eine höhere Priorität als Verkettung.

Also, was Sie wirklich ist die Ausführung dieses:

echo ("$a + $b = " . $a) + $b; 
echo ("$a - $b = " . $a) - $b; 

Im ersten Fall, der in diese eingeschaltet wird:

"1 + 2 = 1" + $b 

Welche PHP versucht "1 + 2 = 1" in eine Zahl umgewandelt werden (aufgrund type juggling) und erhält 1, den Ausdruck in Dreh:

1 + 2 

whic h ist der Grund, warum Sie 3 erhalten. Die gleiche Logik kann auf die Subtraktionsbedingung angewendet werden.

Wenn Sie stattdessen Klammern um die Berechnungen setzen, erhalten Sie die gewünschte Ausgabe.

echo "$a + $b = " . ($a + $b); 
echo "$a - $b = " . ($a - $b); 
+2

Eine andere Lösung besteht darin, nicht zu verketten, sondern mehrere Argumente im Echoaufruf zu verwenden. 'echo" $ a + $ b = ", $ a + $ b;' –

+0

@RobertK oder ['printf()'] (http: // php.net/printf) – Wiseguy

+0

Es schien mir immer unlogisch zu sein, der Hälfte der Operatoren höhere Priorität zu geben als der Verkettung, und die Hälfte von ihnen hat eine niedrigere Priorität ... Weiß jemand, warum das der Fall ist? Ist es nur schlechtes Design oder gibt es einen Grund dafür? – user3640967

1

Die Verkettung hat Vorrang vor Addition und Subtraktion, aber nicht Multiplikation oder Division. So

echo "$a + $b = " . $a + $b; 

entspricht

echo ("$a + $b = " . $a) + $b; 

Und PHP ignoriert den ersten Teil, da es schwierig ist, es in eine Zahl zu konvertieren, können Sie nur mit dem + $b verlassen.

Wenn Sie Klammern verwenden, sollten Sie in Ordnung sein.

0

Nun, Sie haben wirklich seltsames Verhalten gefunden, aber :)

Von dem von der arithmetischen Operatoren, Division und Multiplikation höchste Priorität haben, so dass sie vor der Verkettung ausgewertet.

Während die Addition und Extraktion niedrigere Priorität haben, wird zuerst der linke Teil ausgewertet und dann zum rechten Teil hinzugefügt/extrahiert. Aber PHP versucht, den numerischen Wert aus der Zeichenkette zu extrahieren und nur das erste Zeichen ist so, also tut es das damit.