2010-07-27 47 views

回答

14

您的語句將解析爲人類,如下所示。

回聲一個連接字符串組成:

  1. 功能print('3'),這將返回true,這被字符串化到1
  2. 字符串的結果「2」
  3. 作用的結果print('4'),這將返回true,它被串化爲1

現在,op的順序這裏的演出真的很有趣,根本不能以43211結束!讓我們嘗試一個變體,找出發生了什麼問題。

echo '1' . print('2') . '3' . print('4') . '5'; 

這就產生4523111

PHP是解析這一點,那麼,如:

echo '1' . (print('2' . '3')) . (print('4' . '5')); 

賓果!左邊的print會首先評估,打印'45',這讓我們

echo '1' . (print('2' . '3')) . '1'; 

然後向左print得到評估,因此我們現在已經印刷'4523',留給我們

echo '1' . '1' . '1'; 

成功。 4523111

讓我們來分解你的古怪聲明。

echo print('3') . '2' . print('4'); 

這將打印'4'第一,留給我們

echo print('3' . '2' . '1'); 

那麼接下來的打印語句進行評估,這意味着我們現在已經印刷'4321',留給我們

echo '1'; 

因此,43211

我會強烈建議不要echo荷蘭國際集團一print的結果,也不print荷蘭國際集團的echo的結果。這樣做首先是非常荒謬的。


經進一步審查,實際上,我並不完全相信PHP是如何解析要麼胡說八道的這些位。我不會再想這件事了,它傷害了我的大腦。

+0

+1很好的答案Charles – alex 2010-07-27 02:30:55

+1

+1我想補充一點,語言結構'print'不會像函數那樣得到評估,因此就是奇怪的順序。我幾乎可以說這個嵌套產生或多或少未定義的行爲。 – deceze 2010-07-27 02:30:56

+0

好,我想感謝你這個非常有啓發性的答案。 – Fortisimo 2010-07-27 02:32:42

2

print正在恢復1

documentation

返回值:返回1,始終。

你應該堅持使用echo

+0

我還是不明白爲什麼它按順序輸出(43211)? – Fortisimo 2010-07-27 02:27:31

+0

@Tunji Gbadamosi請參閱[Charles'answer](http://stackoverflow.com/questions/3340330/strange-echo-print-behaviour-in-php/3340367#3340367)。 – alex 2010-07-27 02:30:22

0

你正在使用一個函數內的功能,亞歷克斯說。只需簡單地使用回顯或打印。

echo '3'.'2'.'4'; 

將正確返回或同樣用於打印。

+1

'print'技術上是一種語言結構。 – alex 2010-07-27 02:24:46

+0

是的,如果您在完成時查找返回值,它通常只會更有用。但對於像這樣簡單的事情來說,它的工作幾乎是一樣的;減去當然印刷會給和回聲不會。在極端情況下,回聲可能會更快。 – RageD 2010-07-27 02:28:48

3

大部分的困惑都是由於圍繞參數print的參數放置了括號。如您所知,括號對於語言結構是可選的;你可能不知道的是,他們在解析過程中被刪除。

評估順序

讓我們先刪除括號:

echo print '3' . '2' . print '4'; 

,並說明評價的實際順序:

echo (print ('3' . '2' . (print '4'))) 
^ ^ ^     ^
3  2  1--------->>----------1 

在此的心臟,你會發現一個級聯字符串或字符串表示;這首先計算:

'3' . '2' . (print '4') 

前兩個元件被級聯:

'32' . (print '4') 

然後,(print '4')值評價;打印其參數'4'後,返回值print本身始終爲int(1);這種鑄入一個串'1'和級聯與其它元素:

'321' 

此結束第一步。第二步通過的臨時結果到另一個print聲明:

print '321' 

像以前一樣,'321'印現在int(1)返回的最後一步:

echo 1 

證明

你可以在查看生成的操作碼時確認此行爲(爲了清晰起見添加了輸出列):

line  # * op   return operands  output 
------------------------------------------------+------- 
    1  0 > CONCAT  ~0  '3', '2' | 
     1  PRINT  ~1  '4'   | 4 
     2  CONCAT  ~2  ~0, ~1  | 4 
     3  PRINT  ~3  ~2   | 4321 
     4  ECHO  ~3     | 43211 

說明

  • "3""2"被連接起來 - "32" - 並將其存儲到~0
  • "4"被打印並且返回值int(1)被存儲到~1中。
  • ~0~1級聯 - "321" - 並存儲到~2
  • "321"已打印,返回值存儲在~3中。
  • int(1)由於字符串鑄造而被打印爲"1"