文章轉自: https://learnku.com/php/t/21549
PHP 目前依舊是其它腳本語言強勁的競爭對手,這主要歸功於其核心維護團隊的快速更新。php
自從 PHP 7.0 發佈以來,社區見證了許多新特性的誕生,極大地改進了開發者在項目中應用 PHP 的方式。提升 PHP 應用的性能和安全性,是這些改進的主要目的。html
PHP 最近實現了又一個里程碑 —— 發佈 PHP 7.3。新版本帶來了一些急需的更新。laravel
在本文中,我將論述新推出的 PHP 7.3 特性 和更新。好消息是,你能夠在你的測試服務器上自行安裝新版本、查看新功能。但老生常談,切勿在生產服務器上使用 RC 版本更新,可能會破壞你已經上線的應用。正則表達式
如下是7.3版中引入的一些更新,與之前的版本相比,它們大大提升了 PHP 7.3 的性能 。算法
讓咱們逐一討論上述的每個更新。express
Heredoc 和 Nowdoc 語法可以在使用多行長字符串時起到很大幫助。它要求結束標識符應當爲出如今新行的首個字符串。json
// 除了這樣: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL; // 這樣也能夠: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL;
總的來講,此更新提出了兩項改進,以下:c#
在上面的例子裏,能夠很容易地看出這些改動。windows
在參數、元素、變量列表結尾,追加尾部逗號。有時咱們在數組內以及函數調用(尤爲是可變參函數)時須要傳遞大量元素,如果漏掉一個逗號,便會報錯。鑑於如上狀況,尾部逗號便顯得十分有用。這個特性已經容許在數組內使用,而且從 PHP 7.2 開始,分組命名空間(Grouped Namespaces
)語法也開始支持尾部逗號。數組
use Foo\Bar\{ 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 響應數據,有 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 異常
PHP 使用 PCRE 做爲正則表達式引擎。但從 PHP 7.3 開始,PCRE2 將做爲新的正則引擎大顯身手。因此,你須要將現有的正則表達式遷移到符合 PCRE2 的規則。這些規則比之前更具侵入性。請看如下實例:
preg_match('/[\w-.]+/', '');
這個表達式在新版 PHP 內將會匹配失敗且不會觸發警告。由於 PCRE2 現嚴格要求,若需匹配連字符(-
)而非用於表示範圍,則必須移動到末尾或將其轉義。
更新到 PCRE2 10.x 後,支持瞭如下以及更多特性:
\g{+2}
(等效於已存在的 \g{-2}
)(?(VERSION>=x)...)
(*NOTEMPTY)
和 (*NOTEMPTY_ATSTART)
告知引擎勿返回空匹配(*NO_JIT)
禁用 JIT 優化(*LIMIT_HEAP=d)
限制堆大小爲 d
KB(*LIMIT_DEPTH=d)
設置回溯深度限制爲 d
(*LIMIT_MATCH=d)
設置匹配數量限制爲 d
譯者注:國內正則術語參差不一,「
後向引用」——
Back References
,又稱「
反向引用」、「回溯引用」等,此處參考 PHP 官方手冊的中文譯本。
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);
在 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 是可數的 }
當前版本的 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()
函數。
參考連接: 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]); // 返回真
該函數可以將圖像輸出爲 WBMP 格式。另外一個名爲 imagewbmp()
的函數也一樣具有單色轉換的做用。所以,出於重複緣由,image2wbmp() 現已被廢棄,你可以使用 imagewbmp()
代替它。此函數被棄用後,再次調用它將會觸發已棄用警告。待後續此函數被移除後,再次調用它將會觸發致命錯誤。
使用先前版本的 PHP,你能夠同時使用大小寫敏感和大小寫不敏感的常量。但大小寫不敏感的常量會在使用中形成一點麻煩。因此,爲了解決這個問題,PHP 7.3 廢棄了大小寫不敏感的常量。
原先的狀況是:
const
關鍵字定義的全局常量始終爲「大小寫敏感」。注意此處僅僅是常量自身的名稱,不包含命名空間名的部分,PHP 的命名空間始終爲「大小寫不敏感」。define()
函數定義的常量默認爲「大小寫敏感」。define()
函數並將第三個參數設爲 true
定義的常量爲「大小寫不敏感」。現在 PHP 7.3 提議廢棄並移除如下用法:
true
做爲 define()
的第三個參數。true
、false
以及 null
除外。PHP 7.3 在建議在使用 cookies 時,增長同站點標誌。這個 RFC 會影響4個系統函數。
這個影響會在兩種狀況下起做用。其中一種方式會添加函數的新參數
,另外一種方式容許以數組形式的選項代替其餘單獨選項。
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 ]]] ) // 兩種方式都可.
FastCGI 進程管理器也進行了更新,如今提供了新的方式來記錄 FPM 日誌。
log_limit: 設置容許的日誌長度,能夠超過 1024 字符。
log_buffering: 容許不須要額外緩衝去操做日誌。
decorate _workers_output: 當啓用了 catch_workers_output 時,系統會去禁用渲染輸出。
如官方文檔所述:
默認狀況下,文件描述符以共享讀、寫、刪除的方式去操做。 這頗有效的去映射 POSIX 並容許去刪除正在使用中的文件。但這並非100%都是同樣的,不一樣的平臺可能仍存在一些差別。刪除操做以後,文件目錄仍存在直到全部的文件操做被關閉。
以前咱們已經講解了最新版本的 PHP7.3 的特色,包含了許多新增跟棄用的功能。這些功能均可以在 php.net 網站上找到,而且已經合併到主分支上了。你如今就可使用這些新功能部署在本身的服務器上,你也能夠打開官方RFC頁面查閱每個詳細版本。若是你對着新版 PHP7.3 有任何問題,你能夠在評論下寫下本身的想法。
若是你喜歡這篇文章,而且以爲它頗有幫助,你能夠在 twitter 上關注我,來得到更多的信息!
文章轉自: https://learnku.com/php/t/21549
更多文章: https://learnku.com/laravel/c...