首頁>技術>

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

7
最新評論
  • 2025 年 PS 設計必備!5 個設計師私藏的素材網站,從此告別版權煩惱
  • 開源網盤Nextcloud 21釋出,效能提高了十倍