2012-05-31 17 views
13

मैं है निम्नलिखित कोड:पीएचपी उलझन में है

<?php 

    $a = 1; 
    $b = 2; 

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

?> 

जब मैं अपने कोड निष्पादित मैं:

2 
sum: 3 

क्यों यह पहली बार में स्ट्रिंग "sum:" मुद्रित करने के लिए असफल है गूंज? ऐसा लगता है कि जोड़ कोष्ठक में संलग्न किया गया है।

क्या यह अजीब व्यवहार कहीं भी दस्तावेज है?

+0

यदि आपके प्रश्न का उत्तर दिया गया है, तो आप उत्तर स्वीकार कर सकते हैं। यह सवाल हल के रूप में चिह्नित करता है। – lonesomeday

उत्तर

17

दोनों ऑपरेटरों अलावा + ऑपरेटर और संयोजन . ऑपरेटर एक ही operator precedence है, लेकिन जब से वे साहचर्य छोड़ दिया जाता है कि वे निम्नलिखित की तरह का मूल्यांकन हो:

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

तो अपने पहली पंक्ति है संयोजन पहले और समाप्त होता है अप के साथ:

"sum: 1" + 2 

(अब के बाद से इस एक अंकीय संदर्भ है अपने string gets converted to an integer और इस तरह आप 0 + 2 है, जो तब आप देता है के साथ खत्म 2 उत्पन्न होती हैं।)

+1

[तकनीकी रूप से उनके बराबर प्राथमिकता है] (http://php.net/manual/en/language.operators.precedence.php) तो यह सब सहयोगीता के लिए नीचे है। –

+0

@ माइकल इसे इंगित करने के लिए धन्यवाद! उत्तर अपडेट किया गया – mgibsonbr

8

आप पेज PHP operator precedence लिस्टिंग को देखें, तो आपको लगता है कि संयोजन ऑपरेटर . और इसके अलावा ऑपरेटर + बाईं संबद्धता के साथ, बराबर पूर्वता है देखेंगे। इसका मतलब यह है कि ऑपरेशन बाएं से दाएं किया जाता है, ठीक उसी तरह कोड दिखाता है। उस पर नजर डालते हैं:

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

यह निम्न उत्पादन देता है:

sum: 1 
2 

संयोजन काम करता है, लेकिन आप तो संख्या 2 को स्ट्रिंग sum: 1 जोड़ने के लिए प्रयास करें। Strings that don't start with a number evaluate to 0, इसलिए यह 0 + 2 के बराबर है, जिसके परिणामस्वरूप 2 है।

समाधान, जैसा कि आप अपने प्रश्न में सुझाव देते हैं, ब्रैकेट में अतिरिक्त संचालन को संलग्न करना है, इसलिए उन्हें एक साथ निष्पादित किया जाता है, और फिर उन परिचालनों का परिणाम संगत होता है।

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

जब से तुम echo आप एक अल्पविराम का उपयोग कर सकते संयोजन से अलग करने के लिए इसके अलावा भाषा निर्माण का उपयोग करें: के रूप में उम्मीद

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

काम करता है।

संबंधित मुद्दे