一篇文章幫你了解 PHP 7.3 更新

步履不停
發布: 2023-04-06 21:14:01
原創
5788 人瀏覽過

一篇文章幫你了解 PHP 7.3 更新

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 語法

HeredocNowdoc 語法能夠在使用多行長字串時起到很大幫助。它要求結束標識符應為出現在新行的首個字串。

// 除了这样:

$query = <<<SQL

SELECT *

FROM `table`

WHERE `column` = true;

SQL;

// 这样也可以:

$query = <<<SQL

   SELECT *

   FROM `table`

   WHERE `column` = true;

   SQL;
登入後複製

總的來說,此更新提出了兩個改進,如下:

  1. 閉合標識符前支援縮排
  2. 閉合標識符後不再強制換行

在上面的例子裡,可以很容易看出這些改變。

函數呼叫中允許尾部逗號

在參數、元素、變數清單結尾,追加尾部逗號。有時我們在數組內以及函數呼叫(尤其是可變參函數)時需要傳遞大量元素,若是漏掉一個逗號,便會報錯。鑑於如上情況,尾部逗號便顯得十分有用。這個特性已經允許在陣列內使用,並且從 PHP 7.2 開始,分組命名空間(Grouped Namespaces)語法也開始支援尾部逗號。

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

$foo = [
   &#39;foo&#39;,
   &#39;bar&#39;,
];
登入後複製

當新值需要被追加在此處時,尾部逗號便顯得十分實用。在可變參函數例如 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 异常
登入後複製

升級 PCRE2

PHP 使用 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() 函数。
参考链接:https://wiki.php.net/rfc/array_key_first_l...

Argon2 和 Hash 密码加密性能增强

在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,&#39;time_cost&#39;=> 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: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。truefalse 以及 null 除外。

同站点 Cookie

PHP 7.3 在建议在使用 cookies 时,增加同站点标志。这个 RFC 会影响4个系统函数。

  1. setcookie
  2. setrawcookie
  3. session_set_cookie_params
  4. 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 有任何问题,你可以在评论下写下自己的想法。

相关PHP视频教程推荐:《PHP视频教程》

以上是一篇文章幫你了解 PHP 7.3 更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!