2012-05-31 708 views
13

Tengo el siguiente código:PHP es confuso cuando la suma y la concatenación de

<?php 

    $a = 1; 
    $b = 2; 

    echo "sum: " . $a + $b; 
    echo "sum: " . ($a + $b); 

?> 

Cuando ejecuto mi código me sale:

2 
sum: 3 

¿Por qué fracasan a imprimir la cadena "sum:" en el primer ¿eco? Parece estar bien cuando la adición está entre paréntesis.

¿Está documentado este extraño comportamiento en cualquier lugar?

+0

Si su pregunta ha sido respondida, puede aceptar la respuesta. Esto marca la pregunta como resuelta. – lonesomeday

Respuesta

17

Tanto los operadores del operador Además + y el operador de concatenación . tienen el mismo operator precedence, pero ya que se dejan asociativo que se evalúan como el siguiente:

echo (("sum:" . $a) + $b); 
echo ("sum:" . ($a + $b)); 

Así que su primera línea no la concatenación primero y extremos con:

"sum: 1" + 2 

(ahora ya que este es un contexto numérico de su string gets converted to an integer y por lo tanto se termina con 0 + 2, que luego le da la como resultado 2.)

+1

[Técnicamente tienen la misma precedencia] (http://php.net/manual/en/language.operators.precedence.php) así que todo se reduce a la asociatividad. –

+0

@Michael ¡gracias por señalar eso! Respuesta actualizada – mgibsonbr

8

Si nos fijamos en la página del listado PHP operator precedence, podrás ver que el operador de concatenación . y el operador de suma + tienen la misma precedencia, la asociatividad izquierda. Esto significa que las operaciones se realizan de izquierda a derecha, exactamente como muestra el código. Vamos a ver que:

$output = "sum: " . $a; 
echo $output, "\n"; 
$output = $output + $b; 
echo $output, "\n"; 

Esto da el siguiente resultado:

sum: 1 
2 

Las obras de concatenación, pero a continuación, intenta agregar la cadena sum: 1 al número 2. Strings that don't start with a number evaluate to 0, por lo que esto es equivalente a 0 + 2, lo que resulta en 2.

La solución, como sugiere en su pregunta, es encerrar las operaciones de suma entre corchetes, para que se ejecuten juntas, y luego el resultado de esas operaciones se concatena.

echo "sum: " . ($a + $b); 
1

Dado que se utiliza la construcción del lenguaje echo puede utilizar una coma para separar la adición de la concatenación:

echo "sum: " , $a + $b; 

funciona como se espera.

Cuestiones relacionadas