PHP8.0釋出[1]也有一段時間了,此次釋出帶來了很多實用且強大的功能,比如:
Named arguments// php 7.xhtmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);// php 8.0htmlspecialchars($string, double_encode: false);
傳遞引數時,可以透過指定引數名傳遞。
當然,8.0中的feature不止這些,還有很多。這裡來詳細說一下Saner string to number comparisons,就是本文的標題。
現象PHP中在比較時,我們經常這樣操作:
10 == '10'
結果符合我們的預期,但這樣並不是每次都正確,比如:
// php 7.x0 == 'foobar' // true // php 8.00 == 'foobar' // false
是不是很詭異?
再來一個:
// php 7.xvar_dump(in_array(0, ['foo', 'bar'])); // true// php 8.0var_dump(in_array(0, ['foo', 'bar'])); // false
還有:
// php 7.x$v = 0;switch ($v) { case 'bar': echo 'baaar' . PHP_EOL; case 0: echo 'foo' . PHP_EOL;}// 輸出:// baaar// foo// PHP 8.0// 輸出// foo
為什麼
先來說一下PHP中的比較運算,分為兩類,嚴格型別(===,!==)和非嚴格型別(==, !=, >, >=, 兩者的主要區別如下:
嚴格型別比較底層用的是strcmp(),非嚴格型別使用的是所謂的“智慧”比較,即將字串轉為數字對比在比較陣列時,嚴格型別不光會比較值,還會比較索引的順序,非嚴格型別只會簡單的比較值在比較物件時,嚴格型別使用物件識別符號比較,非嚴格型別只會比較物件的值在使用==比較數字和字串時,PHP 8.0之前的版本會先將字串轉換為數字,之後再做兩個數字間的比較,這也就是為什麼上門0 == "foobar" = true了。
Saner string to number comparisons文章標題說PHP8中字串與數字的比較更智慧,具體智慧在哪裡?針對上面的問題,8.0當中引入Saner string to number comparisons這個特性[2],底層具體的操作為:當比較數字字元時,使用數字與數字對比,而其他字元與數字比較時,統一使用字串比較。我們來透過一個表格來對比下前後的變化:
Comparison | Before | After------------------------------ 0 == "0" | true | true 0 == "0.0" | true | true 0 == "foo" | true | false 0 == "" | true | false42 == " 42" | true | true42 == "42foo" | true | false
如果喜歡,可以關注我哦~
參考:
https://www.php.net/releases/8.0/index.phphttps://wiki.php.net/rfc/string_to_number_comparison
最新評論