摘要:目前依舊是其它腳本語言強勁的競爭對手,這主要歸功于其核心維護團隊的快速更新。有時我們在數組內以及函數調用尤其是可變參函數時需要傳遞大量元素,若是漏掉一個逗號,便會報錯。在可變參函數例如內,更是如此。
PHP 目前依舊是其它腳本語言強勁的競爭對手,這主要歸功于其核心維護團隊的快速更新。
自從 PHP 7.0 發布以來,社區見證了許多新特性的誕生,極大地改進了開發者在項目中應用 PHP 的方式。提高 PHP 應用的性能和安全性,是這些改進的主要目的。
PHP 最近實現了又一個里程碑 ——?發布 PHP 7.3。新版本帶來了一些急需的更新。
在本文中,我將論述新推出的 PHP 7.3 特性 和更新。好消息是,你可以在你的測試服務器上自行安裝新版本、查看新功能。但老生常談,切勿在生產服務器上使用 RC 版本更新,可能會破壞你已經上線的應用。
以下是7.3版中引入的一些更新,與以前的版本相比,它們大大提高了?PHP 7.3 的性能?。
靈活的 Heredoc 和 Nowdoc 語法
函數調用時允許尾隨逗號
JSON_THROW_ON_ERROR
PCRE2 遷移
list() 分配參考
is_countable 函數
array_key_first(), array_key_last()
Argon2 密碼哈希增強功能
棄用和刪除 image2wbmp()
棄用和刪除不區分大小寫的常量
相同站點 Cookie
FPM 更新
改進 Windows 下的文件刪除
讓我們逐一討論上述的每一個更新。
靈活的 Heredoc 和 Nowdoc 語法Heredoc?和 Nowdoc?語法能夠在使用多行長字符串時起到很大幫助。它要求結束標識符應當為出現在新行的首個字符串。
// 除了這樣: $query = <<總的來說,此更新提出了兩項改進,如下:
閉合標識符前支持縮進
閉合標識符后不再強制換行
在上面的例子里,可以很容易地看出這些改動。
函數調用中允許尾部逗號在參數、元素、變量列表結尾,追加尾部逗號。有時我們在數組內以及函數調用(尤其是可變參函數)時需要傳遞大量元素,若是漏掉一個逗號,便會報錯。鑒于如上情況,尾部逗號便顯得十分有用。這個特性已經允許在數組內使用,并且從 PHP 7.2 開始,分組命名空間(Grouped Namespaces)語法也開始支持尾部逗號。
use FooBar{ ???Foo, ???Bar, }; $foo = [ ???"foo", ???"bar", ];當新值需要被追加在此處時,尾部逗號便顯得十分實用。在可變參函數例如 unset() 內,更是如此。
unset( ???$foo, ???$bar, ???$baz, );同時,當你使用 compact() 函數給模版引擎傳遞一批變量時,也是個能用到的例子。
echo $twig->render( ???"index.html", ???compact( ???????"title", ???????"body", ???????"comments", ???) );在某些需要構造連續或分組數據情況下,經常要使用 array_merge() 函數合并數組。也可以利用尾部逗號:
$newArray = array_merge( ???$arrayOne, ???$arrayTwo, ???["foo", "bar"], );同樣,你也可以在調用任意方法、函數以及閉包時使用此特性。
class Foo { ?public function __construct(...$args) { ???// ?} ?public function bar(...$args) { ???// ?} ?public function __invoke(...$args) { ???// ?} } $foo = new Foo( ?"constructor", ?"bar", ); $foo->bar( ?"method", ?"bar", ); $foo( ?"invoke", ?"bar", );JSON_THROW_ON_ERROR解析 JSON 響應數據,有 json_encode() 以及 json_decode() 兩個函數可供使用。不幸的是,它們都沒有恰當的錯誤拋出表現。json_encode 失敗時僅會返回 false;json_decode 失敗時則會返回 null,而 null 可作為合法的 JSON 數值。唯一獲取錯誤的方法是,調用 json_last_error() 或 json_last_error_msg(),它們將分別返回機器可讀和人類可讀的全局錯誤狀態。
該 RFC 提出的解決方案是,為 JSON 函數新增 JSON_THROW_ON_ERROR 常量用于忽略全局錯誤狀態。當錯誤發生時,JSON 函數將會拋出 JsonException 異常,異常消息(message)為 json_last_error() 的返回值,異常代碼(code)為 json_last_error_msg() 的返回值。如下是調用例子:
json_encode($data, JSON_THROW_ON_ERROR); json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR); // 拋出 JsonException 異常升級 PCRE2PHP 使用 PCRE 作為正則表達式引擎。但從 PHP 7.3 開始,PCRE2 將作為新的正則引擎大顯身手。所以,你需要將現有的正則表達式遷移到符合 PCRE2 的規則。這些規則比以前更具侵入性。請看以下實例:
preg_match("/[w-.]+/", "");這個表達式在新版 PHP 內將會匹配失敗且不會觸發警告。因為 PCRE2 現嚴格要求,若需匹配連字符(-)而非用于表示范圍,則必須移動到末尾或將其轉義。
更新到 PCRE2 10.x 后,支持了以下以及更多特性:
相對后向引用 g{+2}(等效于已存在的 g{-2})
PCRE2 版本檢查 (?(VERSION>=x)...)
(*NOTEMPTY) 和 (*NOTEMPTY_ATSTART) 告知引擎勿返回空匹配
(*NO_JIT) 禁用 JIT 優化
(*LIMIT_HEAP=d) 限制堆大小為 d KB
(*LIMIT_DEPTH=d) 設置回溯深度限制為 d
(*LIMIT_MATCH=d) 設置匹配數量限制為 d
譯者注:國內正則術語參差不一,「后向引用」—— Back References,又稱「反向引用」、「回溯引用」等,此處參考 PHP 官方手冊的中文譯本。list() 賦值引用PHP 中的 list() 現在可以賦值給引用,在當前版本中 list() 中賦值不能使用引用,在 PHP 7.3 中將允許使用引用,新改進的語法如下:
$array = [1, 2]; list($a, &$b) = $array;相當于
$array = [1, 2]; $a = $array[0]; $b =& $array[1];在 PHP 7.3 的變更中,我們還可以與 foreach() 方法一起嵌套使用
$array = [[1, 2], [3, 4]]; foreach ($array as list(&$a, $b)) { ???$a = 7; } var_dump($array);is_countable 函數在 PHP 7.2 中,用 count() 獲取對象和數組的數量。如果對象不可數,PHP 會拋出警告?? 。所以需要檢查對象或者數組是否可數。 PHP 7.3 提供新的函數 is_countable()?來解決這個問題。
該 RFC 提供新的函數 is_countable(),對數組類型或者實現了 Countable 接口的實例的變量返回 true 。
之前:
if (is_array($foo) || $foo instanceof Countable) { ???// $foo 是可數的 }之后:
if (is_countable($foo)) { ???// $foo 是可數的 }array_key_first(), array_key_last()當前版本的 PHP 允許使用 reset() ,end() 和 key() 等方法,通過改變數組的內部指針來獲取數組首尾的鍵和值。現在,為了避免這種內部干擾,PHP 7.3 推出了新的函數來解決這個問題:
$key = array_key_first($array); 獲取數組第一個元素的鍵名
$key = array_key_last($array); 獲取數組最后一個元素的鍵名
讓我們看一個例子:
// 關聯數組的用法 $array = ["a" => 1, "b" => 2, "c" => 3]; $firstKey = array_key_first($array); $lastKey = array_key_last($array); assert($firstKey === "a"); assert($lastKey === "c"); // 索引數組的用法 $array = [1 => "a", 2 => "b", 3 => "c"]; $firstKey = array_key_first($array); $lastKey = array_key_last($array); assert($firstKey === 1); assert($lastKey === 3);譯者注:array_value_first() 和 array_value_last() 并沒有通過 RFC 表決;因此 PHP 7.3 內僅提供了 array_key_first() 以及 array_key_last() 函數。Argon2 和 Hash 密碼加密性能增強
參考鏈接:https://wiki.php.net/rfc/arra...在PHP的早期版本中,我們增加了Argon2和哈希密碼加密算法,這是一種使用哈希加密算法來保護密碼的現代算法。它有三種不同的類型,Argon2i,Argon2d和Argon 2id。 我們針對Argon2i密碼散列和基于密碼的密鑰生成進行了優化。 Argon2d性能更快,并使用依賴于內存的數據訪問。 Argon2i使用與內存無關的數據訪問。 Argon2id是Argon2i和Argon2d的混合體,使用依賴于數據和與數據獨立的存儲器訪問的組合。
password_hash():
Argon2id現在是在paswword_ *函數中使用的推薦的Argon2變量。
具有自定義成員方法的名稱的Argon2id與PASSWORD_ARGON2I的使用方法相同 password_hash("password",PASSWORD_ARGON2ID,["memory_cost"=> 1 << 17,"time_cost"=> 4,"threads"=> 2]);password_verify();
除了Argon2i之外,password_verify()函數也適用于Argon2id。
password_needs_rehash();
此函數也將接受Argon2id哈希值,如果任何變量成員發生變化,則返回true。
$hash = password_hash("password", PASSWORD_ARGON2ID); password_needs_rehash($hash, PASSWORD_ARGON2ID); // 返回假 password_needs_rehash($hash, PASSWORD_ARGON2ID, ["memory_cost" => 1<<17]); // 返回真廢棄并移除 image2wbmp()該函數能夠將圖像輸出為 WBMP 格式。另一個名為 imagewbmp() 的函數也同樣具備單色轉換的作用。因此,出于重復原因,image2wbmp()?現已被廢棄,你可使用 imagewbmp() 代替它。此函數被棄用后,再次調用它將會觸發已棄用警告。待后續此函數被移除后,再次調用它將會觸發致命錯誤。
廢棄并移除大小寫不敏感的常量使用先前版本的 PHP,你可以同時使用大小寫敏感和大小寫不敏感的常量。但大小寫不敏感的常量會在使用中造成一點麻煩。所以,為了解決這個問題,PHP 7.3 廢棄了大小寫不敏感的常量。
原先的情況是:
類常量始終為「大小寫敏感」。
使用 const 關鍵字定義的全局常量始終為「大小寫敏感」。注意此處僅僅是常量自身的名稱,不包含命名空間名的部分,PHP 的命名空間始終為「大小寫不敏感」。
使用 define() 函數定義的常量默認為「大小寫敏感」。
使用 define() 函數并將第三個參數設為 true 定義的常量為「大小寫不敏感」。
如今 PHP 7.3 提議廢棄并移除以下用法:
In PHP 7.3: 廢棄使用 true 作為 define() 的第三個參數。
In PHP 7.3: 廢棄使用與定義時的大小寫不一致的名稱,訪問大小寫不敏感的常量。true、false 以及 null 除外。
同站點 CookiePHP 7.3 在建議在使用 cookies 時,增加同站點標志。這個 RFC 會影響4個系統函數。
setcookie
setrawcookie
session_set_cookie_params
session_get_cookie_params
這個影響會在兩種情況下起作用。其中一種方式會添加函數的新參數
,另一種方式允許以數組形式的選項代替其他多帶帶選項。bool setcookie( ???string $name ???[, string $value = "" ???[, int $expire = 0 ???[, string $path = "" ???[, string $domain = "" ???[, bool $secure = false ???[, bool $httponly = false ]]]]]] ) bool setcookie ( ???string $name ???[, string $value = "" ???[, int $expire = 0 ???[, array $options ]]] ) // 兩種方式均可.FPM 更新FastCGI 進程管理器也進行了更新,現在提供了新的方式來記錄 FPM 日志。
log_limit:?設置允許的日志長度,可以超過 1024 字符。
log_buffering:?允許不需要額外緩沖去操作日志。
decorate _workers_output:?當啟用了 catch_workers_output 時,系統會去禁用渲染輸出。
改進 Windows 下的文件刪除如官方文檔所述:
默認情況下,文件描述符以共享讀、寫、刪除的方式去操作。 這很有效的去映射 POSIX 并允許去刪除正在使用中的文件。但這并不是100%都是一樣的,不同的平臺可能仍存在一些差異。刪除操作之后,文件目錄仍存在直到所有的文件操作被關閉。
結束語之前我們已經講解了最新版本的 PHP7.3 的特點,包含了許多新增跟棄用的功能。這些功能都可以在 php.net 網站上找到,并且已經合并到主分支上了。你現在就可以使用這些新功能部署在自己的服務器上,你也可以打開官方RFC頁面查閱每一個詳細版本。如果你對著新版 PHP7.3 有任何問題,你可以在評論下寫下自己的想法。
如果你喜歡這篇文章,并且覺得它很有幫助,你可以在 twitter 上關注我,來獲得更多的信息!轉自 PHP / Laravel 開發者社區 https://laravel-china.org/top...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29870.html
摘要:目前依舊是其它腳本語言強勁的競爭對手,這主要歸功于其核心維護團隊的快速更新。有時我們在數組內以及函數調用尤其是可變參函數時需要傳遞大量元素,若是漏掉一個逗號,便會報錯。在可變參函數例如內,更是如此。 showImg(https://segmentfault.com/img/remote/1460000017544573); PHP 目前依舊是其它腳本語言強勁的競爭對手,這主要歸功于其核...
摘要:原文鏈接一文掌握本地與遠程調試很久沒寫了同樣很很久沒有用了,近期有個簡單的場景要用到,簡單記錄一下關鍵步驟。配置與本地調試的配置不一樣的地方就是和,其他地方大同小異。 原文鏈接:一文掌握PHP Xdebug 本地與遠程調試 很久沒寫PHP了、同樣很很久沒有用XDebug了,近期有個簡單的場景要用到,簡單記錄一下關鍵步驟。 本地調試 本地環境: $ php -v PHP 7.3.4 (c...
摘要:實際應用中,查詢的返回結果會有條記錄。修改保存文件后,重啟服務。通常優化至少到級別,最好能優化到指出使用哪個索引在該表找到行記錄。如果該值為,說明沒有使用索引,可以建立索引提高性能顯示實際使用的索引。 ...
摘要:這種情況并非完全是一個云爆發的場景,因為根據定義,爆發意味著工作負載在一段時間內被移動到云端,然后最終返回到內部部署。在這種情況下,云爆發將是其設計的固有特征。如今,公共云已迅速成為構建IT基礎設施的一種簡單而無障礙的方式。如果企業已經擁有內部部署系統,那么在某些時候,可能就會希望將內部部署和外部部署整合在一起。而實現這一目標的一種方法是采用云爆發,但云爆發究竟是什么?以及爆發在云端意味著什...
閱讀 712·2021-10-14 09:42
閱讀 1966·2021-09-22 15:04
閱讀 1571·2019-08-30 12:44
閱讀 2134·2019-08-29 13:29
閱讀 2730·2019-08-29 12:51
閱讀 542·2019-08-26 18:18
閱讀 698·2019-08-26 13:43
閱讀 2803·2019-08-26 13:38