對於下面的代碼片斷:爲什麼這裏的答案是15?
$a = '5 USD';
$b = 10;
echo $a + $b;
答案是15.但是,在可變$a
如果5
是在'USD'
之間或'USD'
後的輸出是10
。爲什麼是這樣?有人可以解釋嗎?
對於下面的代碼片斷:爲什麼這裏的答案是15?
$a = '5 USD';
$b = 10;
echo $a + $b;
答案是15.但是,在可變$a
如果5
是在'USD'
之間或'USD'
後的輸出是10
。爲什麼是這樣?有人可以解釋嗎?
從php.net:
當一個字符串在數值上下文中計算,將得到的值 和類型被確定如下。
如果字符串不包含任何字符「」,‘E’,或‘E’ 和數值裝配到整數類型的限制(如通過 PHP_INT_MAX定義)時,字符串將被評估爲一個整數。在所有其他 的情況下,它將被評估爲浮動。
該值由字符串的起始部分給出。如果字符串 以有效數字數據開頭,則這將是使用的值。 否則,該值將爲0(零)。有效的數字數據是一個可選符號 ,後跟一個或多個數字(可選包含小數點 ),後跟可選的指數。指數是 'e'或'E'後跟一個或多個數字。
字面上:
$a + $b
裝置numeric + numeric
。"5 USD"
以有效的數字數據開頭,所以PHP將其轉換爲5
。"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.
?>
它能在不提及「串數字轉換」文檔。
因爲
php > echo (int)"a";
0
所以,如果你給PHP與
php > "USD 5" + "10"
則施放兩個操作數爲整數
php > (int)"USD 5" + (int)"10"
,因此,您將收到的0 + 10
參見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).
這就是所謂的「寬鬆打字」和「類型雜耍」http://www.php.net/manual/en/language.types.type-juggling.php –
你能多解釋一下@Mark Barker –
我鏈接的頁面幾乎包含了所有內容....您使用另一個(整數)值(10)的加法運算符,因此PHP會嘗試通過將字符串轉換爲可以添加到10的整數值來添加 –