2017-04-20 59 views
0

我目前正在學習PHP從HTML,CSS,JS和背景,我遇到一些意外的行爲有興趣的我來了。因此,我嘗試用下面的代碼。算術return語句會導致意外行爲

實驗1:

看來,寫入時的算術被刪除/不會呈現前return語句是這樣寫的,應有盡有。

代碼:

<?php 
    function add($num, $num2) { 
     return $num."+".$num2." = ".$num + $num2."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

輸出

17<br> 
21<br> 


實驗2:

然而,當我改變第一可變/參數從$num$num2,似乎每個所述第一變量和+操作者之間被除去。

代碼:

<?php 
    function add($num, $num2) { 
     return $num2."+".$num2." = ".$num + $num2."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

輸出

14<br> 
2<br> 


實驗3:

後它JS,我意識到,把周圍的算術公式將輸出預期的結果括號。

代碼:

<?php 
    function add($num, $num2) { 
     return $num."+".$num2." = ".($num + $num2)."<br>"; 
    } 

    echo add(10, 7) . add(20, 1); 
?> 

輸出

10+7 = 17<br> 
20+1 = 21<br> 

(另一種製造$sum變量將解決這個問題)


問:

我的問題是什麼原因引起的不把公式周圍的括號中的意外的行爲?

回答

2

你看到的行爲是「類型雜耍」的結果。

因爲PHP不是嚴格類型的,所以在需要時可以將字符串解釋爲整數(或假定解釋器需要),反之亦然。所以數據類型被轉換,如果你不小心可能會導致問題。在許多其他語言中,如果將字符串視爲整數或像字符串這樣的整數,則會出現錯誤。例如,JavaScript有String.parseInt()來顯式更改類型。

什麼解釋正在做大致如下,一步一步:

  1. $num - 建立的整數10
  2. 10."+" - 串聯一個字符串

      整數
    • 將當前輸出轉換爲字符串(10變爲"10"),並附加加號
    • 輸出現在是"10+"
  3. "10+".$num2 - 連接字符串與整數

    • 轉換整數爲字符串,並追加它
    • 輸出現在是"10+7"
  4. "10+7"." = " - 連接2個字符串
    • 輸出現在是"10+7 = "
  5. "10+7 = ".$num - 連接字符串與整數
    • 轉換整數爲字符串,並追加它
    • 輸出現在是"10+7 = 10
  6. "10+7 = 10" + $num2 - 字符串和整數之間的算術計算
    • 將字符串轉換爲整數並將其添加到下一個整數。
    • 在這種情況下,當PHP將字符串轉換爲整數時,它從字符串的開始處開始並返回所有數字,直到它遇到第一個非數字,所以"10+7 = 10"拉出10,然後點擊+並停止尋找數字。
    • 現在輸出爲17;
  7. 17."<br>" - 一個整數和一個串
    • 的級聯轉換的整數爲字符串,並追加現在<br>
    • 輸出爲17<br>

參考:類型戲法

+0

很高興成爲服務。由於從nitpicky到真正的問題,PHP有很多誹謗者。對於我來說,它對數據類型如此鬆散的事實是一個真正的抱怨問題,並且會讓很多人出門。只要確保在代碼中明確表達你的意圖,它應該沒問題。哦,還有單元測試。讓您測試各種場景以查看您的代碼是否符合您的期望。 – stratedge

2

如何PHP知道你不想借此$num."+".$num2." = ".$num和算術它添加到這個$num2."<br>"?這不,除非你用括號引起$num + $num2先發生。

在第一個例子:

$num."+".$num2." = ".$num 

等同於字符串:10+7=10,然後:

$num2 

相當於7

當您嘗試添加它們+字符串10+7=10必須強制轉換爲整數10和當加入7給你17那麼字符串<br>是連接在一起。

PHP: String Conversion to Numbers

用括號:

$num."+".$num2." = ".($num + $num2)."<br>"; 

你得到的字符串<br>連接字符串10+7=10+717)連接在一起。

+0

很好的解釋。這裏是[鏈接](http:// php。net/manual/en/language.operators.precedence.php),這說明爲什麼乘法運算符合OP的預期,但加法運算符不能。 – jh1711

+0

'7 + 7'+ 7。
= 7 + 7。 '
'= 14。 '
'= '14
'。你使用了num2兩次。其餘就像AbraCadaver解釋 – jh1711