2012-05-31 12 views
13

Ho il seguente codice:PHP è confuso quando si aggiungono e concatenando

<?php 

    $a = 1; 
    $b = 2; 

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

?> 

Quando eseguo il mio codice ottengo:

2 
sum: 3 

Perché si riescono a stampare la stringa "sum:" nel primo eco? Sembra andare bene quando l'aggiunta è racchiusa tra parentesi.

Questo strano comportamento è ovunque documentato?

+0

Se la tua domanda ha avuto risposta, puoi accettare la risposta. Questo segna la domanda come risolta. – lonesomeday

risposta

17

Entrambi gli operatori l'operatore di addizione + e l'operatore di concatenazione . hanno lo stesso operator precedence, ma dal momento che sono lasciati associative ottengono valutati come la seguente:

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

Quindi la prima linea non concatenazione prima e finisce con:

"sum: 1" + 2 

(Ora, poiché si tratta di un contesto numerico tua string gets converted to an integer e quindi si finisce con 0 + 2, che poi si dà la provocare 2.)

+1

[Tecnicamente hanno uguale precedenza] (http://php.net/manual/en/language.operators.precedence.php) quindi è tutto a favore dell'associatività. –

+0

@ Michael ringrazia per averlo fatto notare! Risposta aggiornata – mgibsonbr

8

Se si guarda la pagina che elenca PHP operator precedence, vedrete che l'operatore di concatenazione . e l'operatore di addizione + hanno uguale precedenza, con associatività a sinistra. Ciò significa che le operazioni vengono eseguite da sinistra a destra, esattamente come mostra il codice. Diamo un'occhiata a che:

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

Questo ha pronunciato la seguente uscita:

sum: 1 
2 

Le opere concatenazione, ma si tenta di aggiungere la stringa sum: 1 al numero 2. Strings that don't start with a number evaluate to 0, quindi questo è equivalente a 0 + 2, che risulta in 2.

La soluzione, come suggerito nella domanda, è racchiudere le operazioni di aggiunta tra parentesi, in modo che vengano eseguite insieme, e quindi il risultato di tali operazioni è concatenato.

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

Dal momento che si utilizza il costrutto del linguaggio echo è possibile utilizzare una virgola per separare l'aggiunta dalla concatenazione:

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

funziona come previsto.