PHP se confunde al agregar y concatenar

Tengo el siguiente código:

 

Cuando ejecuto mi código, obtengo:

 2 sum: 3 

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

¿Está documentado este raro comportamiento en algún lugar?

Ambos operadores el operador + sum y la concatenación . El operador tiene la misma precedencia de operador , pero dado que se dejan asociativos, se evalúan de la siguiente manera:

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

Entonces su primera línea hace la concatenación primero y termina con:

 "sum: 1" + 2 

(Ahora, dado que este es un contexto numérico, tu cadena se convierte a un entero y así terminas con 0 + 2 , que luego te da el resultado 2 ).

Si observa la página que enumera la precedencia del operador PHP , verá que el operador de concatenación . y el operador de sum + tiene la misma precedencia, con asociatividad izquierda. Esto significa que las operaciones se realizan de izquierda a derecha, exactamente como muestra el código. Veamos eso:

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

Esto da el siguiente resultado:

 sum: 1 2 

La concatenación funciona, pero luego intenta agregar la cadena de sum: 1 al número 2 . Las cadenas que no comienzan con un número se evalúan a 0 , por lo que esto es equivalente a 0 + 2 , lo que da como resultado 2 .

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

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

Como utiliza el echo construcción de lenguaje, puede usar una coma para separar la adición de la concatenación:

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

Funciona como se esperaba