2013-05-31 110 views
2

對於下面的代碼片斷:爲什麼這裏的答案是15?

$a = '5 USD'; 
$b = 10; 
echo $a + $b; 

答案是15.但是,在可變$a如果5是在'USD'之間或'USD'後的輸出是10。爲什麼是這樣?有人可以解釋嗎?

+10

這就是所謂的「寬鬆打字」和「類型雜耍」http://www.php.net/manual/en/language.types.type-juggling.php –

+0

你能多解釋一下@Mark Ba​​rker –

+2

我鏈接的頁面幾乎包含了所有內容....您使用另一個(整數)值(10)的加法運算符,因此PHP會嘗試通過將字符串轉換爲可以添加到10的整數值來添加 –

回答

13

php.net

當一個字符串在數值上下文中計算,將得到的值 和類型被確定如下。

如果字符串不包含任何字符「」,‘E’,或‘E’ 和數值裝配到整數類型的限制(如通過 PHP_INT_MAX定義)時,字符串將被評估爲一個整數。在所有其他 的情況下,它將被評估爲浮動。

該值由字符串的起始部分給出。如果字符串 以有效數字數據開頭,則這將是使用的值。 否則,該值將爲0(零)。有效的數字數據是一個可選符號 ,後跟一個或多個數字(可選包含小數點 ),後跟可選的指數。指數是 'e'或'E'後跟一個或多個數字。

字面上:

  1. $a + $b裝置numeric + numeric
  2. "5 USD"以有效的數字數據開頭,所以PHP將其轉換爲5
  3. "USD 5""U5SD"開始與有效的數字數據,所以PHP將其轉換爲0

UPDv1:

<?php 
header('Content-Type: text/plain'); 

function plus($a, $b){ 
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL; 
} 

plus('5 frogs', 3); // 5 + 3 = 8 
plus('frogs: 5', 3); // 0 + 3 = 3 
plus('f5rogs', 3); // 0 (not HEX) + 3 = 3 
plus('0xF5', 3);  // 245 (HEX) + 3 = 248 
plus('0011b', 3);  // 11 (not BIN) + 3 = 14 
plus('1E5', '1.2xx'); // 100000 (FLOAT) + 1.2 (FLOAT) = 100001.2 
plus('true', 2);  // 0 (not BOOL) + 2 = 2 
?> 

而且,看看這個:php string number concatenation messed up


UPDv2:

有 「沒有辦法」 的PHP來強制轉換字符串值八進制,無論零填充效果。仍然如前所述,PHP能夠將字符串轉換爲十六進制。

<?php 
header('Content-Type: text/plain'); 

function plus($a, $b){ 
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL; 
} 

plus(008, 12);  // Invalid octal, PHP assumes it is 0. Result: 12. 
plus('008', 12); // Invalid octal? No, it is decimal. Result: 20. 
plus(0x0F, 1);  // Valid hexadecimal. Result: 16. 
plus('0x0F', 1); // Valid hexadecimal. Result: 16. 
plus('0x0X', 1); // Invalid hexadecimal, PHP assumes it is 0. Result: 1. 
?> 

它能在不提及「串數字轉換」文檔。

0

因爲

php > echo (int)"a"; 
0 

所以,如果你給PHP與

php > "USD 5" + "10" 

則施放兩個操作數爲整數

php > (int)"USD 5" + (int)"10" 

,因此,您將收到的0 + 10

6
結果

參見PHP Manual Language.types.string.conversion

字符串轉換爲數字

當一個字符串被在數值上下文評價,所得到的值和類型被確定爲如下。

如果字符串不包含'。','e'或'E'中的任何字符,並且數值適合整數類型限制(由PHP_INT_MAX定義),則字符串將被評估爲整數。在所有其他情況下,它將被評估爲浮動。

該值由字符串的起始部分給出。如果字符串以有效的數字數據開頭,則這將是使用的值。否則,該值將爲0(零)。有效的數字數據是一個可選符號,後跟一個或多個數字(可選包含一個小數點),後跟一個可選的指數。指數是一個'e'或'E',後跟一個或多個數字。

的例子可以在手動(以上鍊接)

$foo = 1 + "bob-1.3e3";   // $foo is integer (1) 
$foo = 1 + "bob3";    // $foo is integer (1) 
$foo = 1 + "10 Small Pigs";  // $foo is integer (11) 

找到回答你的問題

$a = '5 USD'; //string starts with number so implicit cast to int it will be 5 
$b = 10; 
echo $a + $b; // = 15 

在你寫

$a = 'USD 5'; //string does not start with number so implicit cast to int it will be 0 
$b = 10; 
echo $a + $b; // = 10 

欲瞭解更多信息,其他的例子在這個轉換中,se e Unix manual page for strtod(3).

相關問題