2012-05-31 25 views
13

Tôi đã đoạn mã sau:PHP là bối rối khi thêm và concatenating

<?php 

    $a = 1; 
    $b = 2; 

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

?> 

Khi tôi thực thi mã của tôi, tôi nhận được:

2 
sum: 3 

Tại sao nó không in ra chuỗi "sum:" trong lần đầu tiên echo? Nó có vẻ là tốt khi bổ sung được kèm theo trong dấu ngoặc đơn.

Hành vi kỳ lạ này có được ghi lại ở đâu không?

+0

Nếu câu hỏi của bạn đã được trả lời, bạn có thể chấp nhận câu trả lời. Điều này đánh dấu câu hỏi là đã giải quyết. – lonesomeday

Trả lời

17

Cả hai nhà khai thác các nhà điều hành bổ sung + và các nhà điều hành nối . có cùng operator precedence, nhưng kể từ khi họ còn lại kết hợp họ nhận được đánh giá như sau:

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

Vì vậy, dòng đầu tiên của bạn nào nối đầu tiên và kết thúc với:

"sum: 1" + 2 

(Bây giờ vì đây là một bối cảnh số của bạn string gets converted to an integer và do đó bạn kết thúc với 0 + 2, sau đó cung cấp cho bạn kết quả 2.)

+1

[Về mặt kỹ thuật, chúng có quyền ưu tiên ngang nhau] (http://php.net/manual/en/language.operators.precedence.php) vì vậy tất cả đều là kết hợp. –

+0

@Michael cảm ơn vì đã chỉ ra điều đó! Đã cập nhật câu trả lời – mgibsonbr

8

Nếu bạn nhìn vào các trang liệt kê PHP operator precedence, bạn sẽ thấy rằng các nhà điều hành nối . và các nhà điều hành bổ sung + có ưu tiên như nhau, với associativity trái. Điều này có nghĩa là các thao tác được thực hiện từ trái sang phải, chính xác như mã hiển thị. Hãy xem xét rằng:

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

Điều này cho phép đầu ra sau đây:

sum: 1 
2 

Các công trình nối, nhưng sau đó bạn cố gắng thêm chuỗi sum: 1 với số 2. Strings that don't start with a number evaluate to 0, vì vậy, giá trị này tương đương với 0 + 2, kết quả là 2.

Giải pháp, như bạn đề xuất trong câu hỏi của bạn, là bao gồm các hoạt động bổ sung trong ngoặc đơn, vì vậy chúng được thực hiện cùng nhau, và sau đó kết quả của các hoạt động đó được nối.

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

Vì bạn sử dụng ngôn ngữ xây dựng echo bạn có thể sử dụng dấu phẩy để tách việc bổ sung từ nối:

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

trình như mong đợi.

Các vấn đề liên quan