花式了解PHP7.3更新

今天小編給大家分享的是PHP 7.3 更新的詳細(xì)介紹,相信很多人都不太了解,為了讓大家更加了解PHP 7.3 更新,所以給大家總結(jié)了以下內(nèi)容,話不多說(shuō),一起往下看吧

目前創(chuàng)新互聯(lián)建站已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、潁東網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

PHP 目前依舊是其它腳本語(yǔ)言強(qiáng)勁的競(jìng)爭(zhēng)對(duì)手,這主要?dú)w功于其核心維護(hù)團(tuán)隊(duì)的快速更新。

自從 PHP 7.0 發(fā)布以來(lái),社區(qū)見證了許多新特性的誕生,極大地改進(jìn)了開發(fā)者在項(xiàng)目中應(yīng)用 PHP 的方式。提高 PHP 應(yīng)用的性能和安全性,是這些改進(jìn)的主要目的。

PHP 最近實(shí)現(xiàn)了又一個(gè)里程碑 —— 發(fā)布 PHP 7.3。新版本帶來(lái)了一些急需的更新。

在本文中,我將論述新推出的 PHP 7.3 特性 和更新。好消息是,你可以在你的測(cè)試服務(wù)器上自行安裝新版本、查看新功能。但老生常談,切勿在生產(chǎn)服務(wù)器上使用 RC 版本更新,可能會(huì)破壞你已經(jīng)上線的應(yīng)用。

以下是7.3版中引入的一些更新,與以前的版本相比,它們大大提高了 PHP 7.3 的性能 。

  • 靈活的 Heredoc 和 Nowdoc 語(yǔ)法
  • 函數(shù)調(diào)用時(shí)允許尾隨逗號(hào)
  • JSON_THROW_ON_ERROR
  • PCRE2 遷移
  • list() 分配參考
  • is_countable 函數(shù)
  • array_key_first(), array_key_last()
  • Argon2 密碼哈希增強(qiáng)功能
  • 棄用和刪除 image2wbmp()
  • 棄用和刪除不區(qū)分大小寫的常量
  • 相同站點(diǎn) Cookie
  • FPM 更新
  • 改進(jìn) Windows 下的文件刪除

讓我們逐一討論上述的每一個(gè)更新。

靈活的 Heredoc 和 Nowdoc 語(yǔ)法

Heredoc 和 Nowdoc 語(yǔ)法能夠在使用多行長(zhǎng)字符串時(shí)起到很大幫助。它要求結(jié)束標(biāo)識(shí)符應(yīng)當(dāng)為出現(xiàn)在新行的首個(gè)字符串。

// 除了這樣:

$query = <<<SQL

SELECT *

FROM `table`

WHERE `column` = true;

SQL;

// 這樣也可以:

$query = <<<SQL

   SELECT *

   FROM `table`

   WHERE `column` = true;

   SQL;

總的來(lái)說(shuō),此更新提出了兩項(xiàng)改進(jìn),如下:

  1. 閉合標(biāo)識(shí)符前支持縮進(jìn)
  2. 閉合標(biāo)識(shí)符后不再?gòu)?qiáng)制換行

在上面的例子里,可以很容易地看出這些改動(dòng)。

函數(shù)調(diào)用中允許尾部逗號(hào)

在參數(shù)、元素、變量列表結(jié)尾,追加尾部逗號(hào)。有時(shí)我們?cè)跀?shù)組內(nèi)以及函數(shù)調(diào)用(尤其是可變參函數(shù))時(shí)需要傳遞大量元素,若是漏掉一個(gè)逗號(hào),便會(huì)報(bào)錯(cuò)。鑒于如上情況,尾部逗號(hào)便顯得十分有用。這個(gè)特性已經(jīng)允許在數(shù)組內(nèi)使用,并且從 PHP 7.2 開始,分組命名空間(Grouped Namespaces)語(yǔ)法也開始支持尾部逗號(hào)。

use Foo\Bar\{
   Foo,
   Bar,
};

$foo = [
   'foo',
   'bar',
];

當(dāng)新值需要被追加在此處時(shí),尾部逗號(hào)便顯得十分實(shí)用。在可變參函數(shù)例如 unset() 內(nèi),更是如此。

unset(
   $foo,
   $bar,
   $baz,
);

同時(shí),當(dāng)你使用 compact() 函數(shù)給模版引擎?zhèn)鬟f一批變量時(shí),也是個(gè)能用到的例子。

echo $twig->render(
   'index.html',
   compact(
       'title',
       'body',
       'comments',
   )
);

在某些需要構(gòu)造連續(xù)或分組數(shù)據(jù)情況下,經(jīng)常要使用 array_merge() 函數(shù)合并數(shù)組。也可以利用尾部逗號(hào):

$newArray = array_merge(
   $arrayOne,
   $arrayTwo,
   ['foo', 'bar'],
);

同樣,你也可以在調(diào)用任意方法、函數(shù)以及閉包時(shí)使用此特性。

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 響應(yīng)數(shù)據(jù),有 json_encode() 以及 json_decode() 兩個(gè)函數(shù)可供使用。不幸的是,它們都沒(méi)有恰當(dāng)?shù)腻e(cuò)誤拋出表現(xiàn)。json_encode 失敗時(shí)僅會(huì)返回 false;json_decode 失敗時(shí)則會(huì)返回 null,而 null 可作為合法的 JSON 數(shù)值。唯一獲取錯(cuò)誤的方法是,調(diào)用 json_last_error()json_last_error_msg(),它們將分別返回機(jī)器可讀和人類可讀的全局錯(cuò)誤狀態(tài)。

該 RFC 提出的解決方案是,為 JSON 函數(shù)新增 JSON_THROW_ON_ERROR 常量用于忽略全局錯(cuò)誤狀態(tài)。當(dāng)錯(cuò)誤發(fā)生時(shí),JSON 函數(shù)將會(huì)拋出 JsonException 異常,異常消息(message)為 json_last_error() 的返回值,異常代碼(code)為 json_last_error_msg() 的返回值。如下是調(diào)用例子:

json_encode($data, JSON_THROW_ON_ERROR);

json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR);

// 拋出 JsonException 異常

升級(jí) PCRE2

PHP 使用 PCRE 作為正則表達(dá)式引擎。但從 PHP 7.3 開始,PCRE2 將作為新的正則引擎大顯身手。所以,你需要將現(xiàn)有的正則表達(dá)式遷移到符合 PCRE2 的規(guī)則。這些規(guī)則比以前更具侵入性。請(qǐng)看以下實(shí)例:

preg_match('/[\w-.]+/', '');

這個(gè)表達(dá)式在新版 PHP 內(nèi)將會(huì)匹配失敗且不會(huì)觸發(fā)警告。因?yàn)?PCRE2 現(xiàn)嚴(yán)格要求,若需匹配連字符(-)而非用于表示范圍,則必須移動(dòng)到末尾或?qū)⑵滢D(zhuǎn)義。

更新到 PCRE2 10.x 后,支持了以下以及更多特性:

  • 相對(duì)后向引用 \g{+2}(等效于已存在的 \g{-2}
  • PCRE2 版本檢查 (?(VERSION>=x)...)
  • (*NOTEMPTY)(*NOTEMPTY_ATSTART) 告知引擎勿返回空匹配
  • (*NO_JIT) 禁用 JIT 優(yōu)化
  • (*LIMIT_HEAP=d) 限制堆大小為 d KB
  • (*LIMIT_DEPTH=d) 設(shè)置回溯深度限制為 d
  • (*LIMIT_MATCH=d) 設(shè)置匹配數(shù)量限制為 d

譯者注:國(guó)內(nèi)正則術(shù)語(yǔ)參差不一,「后向引用」—— Back References,又稱「反向引用」、「回溯引用」等,此處參考 PHP 官方手冊(cè)的中文譯本。

list() 賦值引用

PHP 中的 list() 現(xiàn)在可以賦值給引用,在當(dāng)前版本中 list() 中賦值不能使用引用,在 PHP 7.3 中將允許使用引用,新改進(jìn)的語(yǔ)法如下:

$array = [1, 2];
list($a, &$b) = $array;

相當(dāng)于

$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 函數(shù)

在 PHP 7.2 中,用 count() 獲取對(duì)象和數(shù)組的數(shù)量。如果對(duì)象不可數(shù),PHP 會(huì)拋出警告?? 。所以需要檢查對(duì)象或者數(shù)組是否可數(shù)。 PHP 7.3 提供新的函數(shù) is_countable() 來(lái)解決這個(gè)問(wèn)題。

該 RFC 提供新的函數(shù) is_countable(),對(duì)數(shù)組類型或者實(shí)現(xiàn)了 Countable 接口的實(shí)例的變量返回 true 。

之前:

if (is_array($foo) || $foo instanceof Countable) {
   // $foo 是可數(shù)的
}

之后:

if (is_countable($foo)) {
   // $foo 是可數(shù)的
}

array_key_first(), array_key_last()

當(dāng)前版本的 PHP 允許使用 reset() ,end()key() 等方法,通過(guò)改變數(shù)組的內(nèi)部指針來(lái)獲取數(shù)組首尾的鍵和值?,F(xiàn)在,為了避免這種內(nèi)部干擾,PHP 7.3 推出了新的函數(shù)來(lái)解決這個(gè)問(wèn)題:

  • $key = array_key_first($array); 獲取數(shù)組第一個(gè)元素的鍵名
  • $key = array_key_last($array); 獲取數(shù)組最后一個(gè)元素的鍵名

讓我們看一個(gè)例子:

// 關(guān)聯(lián)數(shù)組的用法
$array = ['a' => 1, 'b' => 2, 'c' => 3];

$firstKey = array_key_first($array);
$lastKey = array_key_last($array);

assert($firstKey === 'a');
assert($lastKey === 'c');

// 索引數(shù)組的用法
$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() 并沒(méi)有通過(guò) RFC 表決;因此 PHP 7.3 內(nèi)僅提供了 array_key_first() 以及 array_key_last() 函數(shù)。
參考鏈接:https://wiki.php.net/rfc/array_key_first_l...

Argon2 和 Hash 密碼加密性能增強(qiáng)

在PHP的早期版本中,我們?cè)黾恿薃rgon2和哈希密碼加密算法,這是一種使用哈希加密算法來(lái)保護(hù)密碼的現(xiàn)代算法。它有三種不同的類型,Argon2i,Argon2d和Argon 2id。 我們針對(duì)Argon2i密碼散列和基于密碼的密鑰生成進(jìn)行了優(yōu)化。 Argon2d性能更快,并使用依賴于內(nèi)存的數(shù)據(jù)訪問(wèn)。 Argon2i使用與內(nèi)存無(wú)關(guān)的數(shù)據(jù)訪問(wèn)。 Argon2id是Argon2i和Argon2d的混合體,使用依賴于數(shù)據(jù)和與數(shù)據(jù)獨(dú)立的存儲(chǔ)器訪問(wèn)的組合。

password_hash():

Argon2id現(xiàn)在是在paswword_ *函數(shù)中使用的推薦的Argon2變量。

具有自定義成員方法的名稱的Argon2id與PASSWORD_ARGON2I的使用方法相同
password_hash('password',PASSWORD_ARGON2ID,['memory_cost'=> 1 << 17,'time_cost'=> 4,'threads'=> 2]);

password_verify();

除了Argon2i之外,password_verify()函數(shù)也適用于Argon2id。

password_needs_rehash();

此函數(shù)也將接受Argon2id哈希值,如果任何變量成員發(fā)生變化,則返回true。

$hash = password_hash('password', PASSWORD_ARGON2ID);
password_needs_rehash($hash, PASSWORD_ARGON2ID); // 返回假
password_needs_rehash($hash, PASSWORD_ARGON2ID, ['memory_cost' => 1<<17]); // 返回真

廢棄并移除 image2wbmp()

該函數(shù)能夠?qū)D像輸出為 WBMP 格式。另一個(gè)名為 imagewbmp() 的函數(shù)也同樣具備單色轉(zhuǎn)換的作用。因此,出于重復(fù)原因,image2wbmp() 現(xiàn)已被廢棄,你可使用 imagewbmp() 代替它。此函數(shù)被棄用后,再次調(diào)用它將會(huì)觸發(fā)已棄用警告。待后續(xù)此函數(shù)被移除后,再次調(diào)用它將會(huì)觸發(fā)致命錯(cuò)誤。

廢棄并移除大小寫不敏感的常量

使用先前版本的 PHP,你可以同時(shí)使用大小寫敏感和大小寫不敏感的常量。但大小寫不敏感的常量會(huì)在使用中造成一點(diǎn)麻煩。所以,為了解決這個(gè)問(wèn)題,PHP 7.3 廢棄了大小寫不敏感的常量。

原先的情況是:

  • 類常量始終為「大小寫敏感」。
  • 使用 const 關(guān)鍵字定義的全局常量始終為「大小寫敏感」。注意此處僅僅是常量自身的名稱,不包含命名空間名的部分,PHP 的命名空間始終為「大小寫不敏感」。
  • 使用 define() 函數(shù)定義的常量默認(rèn)為「大小寫敏感」。
  • 使用 define() 函數(shù)并將第三個(gè)參數(shù)設(shè)為 true 定義的常量為「大小寫不敏感」。

如今 PHP 7.3 提議廢棄并移除以下用法:

  • In PHP 7.3: 廢棄使用 true 作為 define() 的第三個(gè)參數(shù)。
  • In PHP 7.3: 廢棄使用與定義時(shí)的大小寫不一致的名稱,訪問(wèn)大小寫不敏感的常量。true、false 以及 null 除外。

同站點(diǎn) Cookie

PHP 7.3 在建議在使用 cookies 時(shí),增加同站點(diǎn)標(biāo)志。這個(gè) RFC 會(huì)影響4個(gè)系統(tǒng)函數(shù)。

  1. setcookie
  2. setrawcookie
  3. session_set_cookie_params
  4. session_get_cookie_params

這個(gè)影響會(huì)在兩種情況下起作用。其中一種方式會(huì)添加函數(shù)的新參數(shù)
,另一種方式允許以數(shù)組形式的選項(xiàng)代替其他單獨(dú)選項(xiàng)。

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 進(jìn)程管理器也進(jìn)行了更新,現(xiàn)在提供了新的方式來(lái)記錄 FPM 日志。

log_limit: 設(shè)置允許的日志長(zhǎng)度,可以超過(guò) 1024 字符。

log_buffering: 允許不需要額外緩沖去操作日志。

decorate _workers_output: 當(dāng)啟用了 catch_workers_output 時(shí),系統(tǒng)會(huì)去禁用渲染輸出。

改進(jìn) Windows 下的文件刪除

如官方文檔所述:

默認(rèn)情況下,文件描述符以共享讀、寫、刪除的方式去操作。 這很有效的去映射 POSIX 并允許去刪除正在使用中的文件。但這并不是100%都是一樣的,不同的平臺(tái)可能仍存在一些差異。刪除操作之后,文件目錄仍存在直到所有的文件操作被關(guān)閉。

以上就是 PHP 7.3 更新的具體操作,代碼應(yīng)該是足夠清楚的,而且我也相信有相當(dāng)?shù)囊恍├涌赡苁俏覀內(nèi)粘9ぷ骺赡軙?huì)見得到的。通過(guò)這篇文章,希望你能收獲更多。

文章標(biāo)題:花式了解PHP7.3更新
文章來(lái)源:http://bm7419.com/article28/gipgcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、Google、外貿(mào)建站網(wǎng)站設(shè)計(jì)公司、網(wǎng)站營(yíng)銷網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)