この記事では、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 function
array_key_first()、array_key_last()
Argon2 パスワード ハッシュの機能強化
非推奨となり削除された image2wbmp()
大文字と小文字を区別しない定数の非推奨と削除
// 除了这样: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL; // 这样也可以: $query = <<<SQL SELECT * FROM `table` WHERE `column` = true; SQL;
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_encode() と
json_decode() という 2 つの関数を使用できます。残念ながら、それらのどれも適切なエラースロー動作を持っていません。
json_encode は失敗した場合のみ
false を返します。
json_decode は失敗した場合に
null を返します。有効な JSON 値として使用されます。エラーを取得する唯一の方法は、
json_last_error() または
json_last_error_msg() を呼び出すことです。これにより、それぞれ機械可読および人間可読のグローバル エラー ステータスが返されます。
この RFC で提案されている解決策は、新しい
JSON_THROW_ON_ERROR
JsonException 例外をスローします。例外メッセージ (
message) は
json_last_error() の戻り値であり、例外はcode (
code) は
json_last_error_msg() の戻り値です。以下は呼び出し例です。
json_encode($data, JSON_THROW_ON_ERROR); json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR); // 抛出 JsonException 异常
Upgrade PCRE2
PHP は正規表現エンジンとして PCRE を使用します。しかし、PHP 7.3 以降、PCRE2 は新しい通常のエンジンとしてその才能を発揮します。したがって、PCRE2 ルールに準拠するには、既存の正規表現を移行する必要があります。これらのルールは以前よりも煩わしいものになっています。次の例を参照してください。 preg_match('/[\w-.]+/', '');
-
) を範囲を表すのではなく一致させる場合は、末尾に移動するかエスケープする必要があります。PCRE2 10.x に更新すると、以下の機能がサポートされます:
\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 官方手册的中文译本。
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 提议废弃并移除以下用法:
In PHP 7.3: 废弃使用 true
作为 define()
的第三个参数。
In PHP 7.3: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。true
、false
以及 null
除外。
PHP 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 ]]] ) // 两种方式均可.
FastCGI 进程管理器也进行了更新,现在提供了新的方式来记录 FPM 日志。
log_limit: 设置允许的日志长度,可以超过 1024 字符。
log_buffering: 允许不需要额外缓冲去操作日志。
decorate _workers_output: 当启用了 catch_workers_output 时,系统会去禁用渲染输出。
如官方文档所述:
默认情况下,文件描述符以共享读、写、删除的方式去操作。 这很有效的去映射 POSIX 并允许去删除正在使用中的文件。但这并不是100%都是一样的,不同的平台可能仍存在一些差异。删除操作之后,文件目录仍存在直到所有的文件操作被关闭。
以上がPHP 7.3 アップデート内容の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。