2012-08-16 18 views
6

que comenzó a aprender PHP no hace mucho tiempo y me encontré con este tema:PHP concatenación de cadenas y operaciones aritméticas

<?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 />"; 

me sale el siguiente resultado:

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

Las dos últimas líneas en la salida no es lo que esperaría.

¿Por qué es esto? ¿Cómo se evalúan estas expresiones? Estoy tratando de entender mejor el idioma.

+0

Como regla general, probablemente no deberías confiar en el tipado débil de PHP de todos modos. –

Respuesta

8

Esto sucede porque el operador de concatenación tiene un higher precedence que los operadores de suma o resta, pero la multiplicación y la división tienen una precedencia más alta que la concatenación.

Por lo tanto, lo que realmente está ejecutando es la siguiente:

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

En el primer caso, que consigue convirtió en esto:

"1 + 2 = 1" + $b 

Qué PHP intenta convertir en un número "1 + 2 = 1" (debido a type juggling) y obtiene 1, convirtiendo la expresión en:

1 + 2 

Whic Es por eso que obtienes 3. La misma lógica se puede aplicar a la condición de resta.

En cambio, si coloca los paréntesis entre los cálculos, obtendrá el resultado deseado.

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

Otra solución es no concatenar, pero usar múltiples argumentos en la llamada para hacer eco. 'echo" $ a + $ b = ", $ a + $ b;' –

+0

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

+0

Siempre me ha parecido realmente ilógico dar a la mitad de los operadores mayor precedencia que la concatenación, y la mitad de ellos con menor precedencia ... ¿Alguien sabe por qué este es el caso? ¿Es solo un mal diseño o hay una razón para ello? – user3640967

1

concatenación tiene prioridad sobre la suma y la resta, pero no la multiplicación o división. Así

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

es equivalente a

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

y PHP no tiene en cuenta la primera parte, ya que es difícil para convertirlo en un número, dejándole con sólo el + $b.

Si usa paréntesis, debería estar bien.

0

Bueno, usted ha encontrado un comportamiento muy extraño, pero :)

Desde el de los operadores aritméticos, división y multiplicación tiene precedencia más alta, por lo que son evaluados antes de la concatenación.

Mientras que la adición y la extracción tienen una prioridad menor, entonces primero se evalúa la parte izquierda y luego se agrega/extrae a la parte derecha. Pero PHP intenta extraer el valor numérico de la cadena y solo el primer carácter es así, por lo que lo hace con él.

Cuestiones relacionadas