2012-05-31 16 views
13

Mam następujący kod:PHP jest zmieszany podczas dodawania i złączenie

<?php 

    $a = 1; 
    $b = 2; 

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

?> 

Kiedy wykonać mój kod otrzymuję:

2 
sum: 3 

Dlaczego nie drukować ciąg "sum:" w pierwszym Echo? Wydaje się, że wszystko jest w porządku, gdy dodawanie jest ujęte w nawiasy.

Czy to dziwne zachowanie zostało udokumentowane w dowolnym miejscu?

+0

Jeśli Twoje pytanie zostało odebrane, możesz zaakceptować odpowiedź. Oznacza to, że pytanie zostało rozwiązane. – lonesomeday

Odpowiedz

17

Obaj operatorzy operator dodawania + a operatorem konkatenacji . mają takie same operator precedence, ale ponieważ są one wiązanie lewe dostają oceniano jak następuje:

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

Więc Twoja pierwsza linia ma konkatenacji pierwszy i końce z:

"sum: 1" + 2 

(obecnie, ponieważ jest to kontekst numeryczny swój string gets converted to an integer a więc skończyć z 0 + 2, które następnie daje skutkować 2.)

+1

[Technicznie mają równy priorytet] (http://php.net/manual/en/language.operators.precedence.php), więc to wszystko zależy od asocjatywności. –

+0

@Michael dzięki za wskazanie tego! Odpowiedź zaktualizowana – mgibsonbr

8

Jeśli spojrzeć na stronę z listą PHP operator precedence, zobaczysz, że operator konkatenacji . i operator dodawania + mają równe pierwszeństwo z lewej skojarzeń. Oznacza to, że operacje są wykonywane od lewej do prawej, dokładnie tak, jak pokazuje kod. Spójrzmy na to:

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

To daje następujący wynik:

sum: 1 
2 

pracach konkatenacji, ale spróbuj dodać ciąg sum: 1 do liczby 2. Strings that don't start with a number evaluate to 0, więc jest to równoważne z 0 + 2, co daje 2.

Rozwiązaniem, jak sugerujesz w pytaniu, jest umieszczenie operacji dodawania w nawiasach, więc są one wykonywane razem, a następnie wynik tych operacji jest konkatenowany.

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

Od użyć konstruktu języka echo można użyć przecinka, aby oddzielić dodatek z konkatenacji:

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

działa zgodnie z oczekiwaniami.

Powiązane problemy