PHP

2012-05-31 27 views
13

Aşağıdaki kodu var karıştı Eko? Ek, parantez içine alındığında iyi görünüyor.PHP

Her yerde bu tuhaf davranış belgelendi mi?

+0

Sorunuz yanıtlandıysa, cevabı kabul edebilirsiniz. Bu, sorunun çözüldüğünü belirtir. – lonesomeday

cevap

17

Hem operatörler ilave + operatörü ve birleştirme . operatör operator precedence aynı var, ama onlar ilişkisel bırakılır beri aşağıdaki gibi değerlendirilir olsun: Birinci ve uçları

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

Yani ilk satır yok birleştirme kadar olan: (Şimdi bu sayısal bağlam olduğundan

"sum: 1" + 2 

senin string gets converted to an integer ve böylece daha sonra verir 0 + 2, ile bitirmek 2 sonuçlanır.)

+1

[Teknik olarak eşit önceliğe sahiptirler] (http://php.net/manual/en/language.operators.precedence.php) bu yüzden her şey birleşikliğe düşer. –

+0

@Michael bunu işaret ettiğin için teşekkürler! Yanıt güncellendi – mgibsonbr

8

Eğer PHP operator precedence listeleme sayfasına baktığınızda ise, birleştirme operatörü . ve toplama operatörü + sol çağrışımsal ile eşit önceliğe sahip olduğunu göreceksiniz. Bu, işlemlerin tam olarak kodun gösterdiği gibi soldan sağa yapıldığı anlamına gelir.

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

Bu aşağıdaki çıktıyı verir:

sum: 1 
2 

birleştirme çalışmalarını, ancak daha sonra sayı 2 dizesi sum: 1 eklemeyi deneyin Şuna bakalım. Strings that don't start with a number evaluate to 0, bu nedenle 0 + 2'a eşdeğerdir, bu da 2 ile sonuçlanır.

Sorunuzda önerdiğiniz gibi çözüm, ekleme işlemlerini parantez içine almak, böylece birlikte yürütülür ve bu işlemlerin sonucu birleştirilir.

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

Eğer birleştirme gelen ek ayırmak için virgül kullanabilirsiniz echo dil yapısı kullanmak beri:

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

İşleri beklendiği gibi.