新機能
PHP コア
ヒアドキュメントと Nowdoc構文 がより柔軟に
文字列を閉じるマーカーの後に、セミコロンや改行文字を続ける必要はなくなりました。 それに加えて、文字列を閉じるマーカーはインデントされていても構いません。 この場合、インデントは文字列の全ての行から取り除かれます。
配列へ分割して代入する操作が、リファレンスへの代入をサポート
配列の要素に分割して代入する操作が、[&$a, [$b, &$c]] =
$d
という文法を用いて、リファレンスへの代入をサポートしました。
同じ操作は、list() 関数でもサポートされています。
instanceof 演算子が、リテラルを受け入れるように
instanceof
演算子が、最初のオペランドにリテラルを受け入れるようになりました。この場合、結果は常に
false
を返します。
いくつかのコンパイルエラーが、CompileError 例外に
CompileError 例外が新たに追加されました。これは
ParseError クラスを継承しています。
少ない数ですが、いくつかのコンパイルエラーが致命的なエラーを生成せず、CompileError
例外をスローするようになります。
現状は、この変更は TOKEN_PARSE
モードで
token_get_all()
が実行された場合にスローされる可能性があるコンパイルエラーだけに影響しますが、将来より多くのエラーがこの例外に変換される可能性があります。
関数やメソッド呼び出しの後に、カンマを付けられるように
関数やメソッド呼び出しの後に、カンマを付けられるようになりました。
Argon2id のサポート
configure コマンドに --with-password-argon2[=dir]
オプションを与えることで、Argon2i と Argon2id ハッシュが password_hash(), password_verify(),
password_get_info(), および
password_needs_rehash()
でサポートされるようになります。
PASSWORD_ARGON2ID
を使うことで、パスワードはハッシュ化され、検証されます。
password_*() 関数で Argon2i と Argon2id
のサポートを使うには、PHP を libargon2 ≥
20161029 とリンクする必要があります。
php-fpm
FPM のロギングをカスタマイズするために、新しいオプションが追加されました。
log_limit
- このグローバルオプションは、1024文字以上のログを改行なしにロギングするために、ログの長さの限界を設定するために使います。これにより、様々な改行の問題も修正されます。
log_buffering
- このグローバルオプションによって、追加のバッファリングなしに、実験的なロギングを行うことができます。
decorate_workers_output
-
このプールオプションを使うことで、
catch_workers_output
が有効になった場合に、ワーカーの出力をデコレートする機能を無効にできます。
BC Math 関数
bcscale() 関数は、現在使われている基数を取得する getter としても使えるようになりました。
LDAP
LDAPコントロールの完全なサポートが LDAP クエリ関数と ldap_parse_result() 関数に追加されました:
-
コントロールをサーバーに送信するために
$controls
パラメータが ldap_add(), ldap_mod_replace(), ldap_mod_add(), ldap_mod_del(), ldap_rename(), ldap_compare(), ldap_delete(), ldap_modify_batch(), ldap_search(), ldap_list() および ldap_read() 関数に追加されました。 -
サーバーからコントロールを取得するために、出力パラメータ
$controls
が ldap_parse_result() 関数に追加されました。 -
ldap_get_option() と
ldap_set_option() 関数の
LDAP_OPT_SERVER_CONTROLS
とLDAP_OPT_CLIENT_CONTROLS
のサポートが修正されました。
マルチバイト文字列関数
完全なケースマッピングとケースフォールディングのサポート
完全なケースマッピングとケースフォールディングのサポートが追加されました。 シンプルな大文字小文字のマッピングと異なり、完全なケースマッピング では、文字列の長さが変わる場合があります。たとえば、以下のようになります:
<?php
mb_strtoupper("Straße");
// Produces STRAßE on PHP 7.2
// Produces STRASSE on PHP 7.3
?>
-
MB_CASE_LOWER
(mb_strtolower() で使われています) -
MB_CASE_UPPER
(mb_strtoupper() で使われています) -
MB_CASE_TITLE
-
MB_CASE_FOLD
-
MB_CASE_LOWER_SIMPLE
-
MB_CASE_UPPER_SIMPLE
-
MB_CASE_TITLE_SIMPLE
-
MB_CASE_FOLD_SIMPLE
(大文字小文字を区別しない操作で使います)
大文字小文字を区別しない文字列操作は、ケースフォールディングを使う
大文字小文字を区別しない文字列操作は、比較の際にケースマッピングではなく、ケースフォールディング を使うようになりました。 これは、より多くの文字が (大文字小文字を区別しないという意味で) 等価と見做されるようになったことを意味します。
MB_CASE_TITLE による Title-Case 変換
mb_convert_case() 関数を
MB_CASE_TITLE
と使うと、Unicodeプロパティ由来の大文字小文字の区別の有無に基づいて、Title-case
変換を行うようになりました。この変更は特に、クォートやアポストロフィーのハンドリングも改善します。
Unicode 11 のサポート
マルチバイト文字列 のデータテーブルは、Unicode 11 をサポートするように更新されました。
長い文字列のサポート
マルチバイト文字列関数 は 2GB 以上の文字列を正しくサポートするようになりました。
パフォーマンスの向上
マルチバイト文字列 拡張モジュールのパフォーマンスが全体的に大きく向上しました。大文字小文字のケースの変換関数で、一番大きな改善が見られます。
名前付きキャプチャのサポート
mb_ereg_*
関数は、名前付きキャプチャをサポートしました。
mb_ereg() のようなマッチング関数は
グループ番号と名前の両方を使って名前付きキャプチャを返します。これは PCRE
に似た動作です:
<?php
mb_ereg('(?<word>\w+)', '国', $matches);
// => [0 => "国", 1 => "国", "word" => "国"];
?>
\k<>
と \k''
記法をサポートしました:
<?php
mb_ereg_replace('\s*(?<word>\w+)\s*', "_\k<word>_\k'word'_", ' foo ');
// => "_foo_foo_"
?>
\k<>
and \k''
記法は、数値参照にも使えます。これは、9以上のグループ番号でも動作します。
Readline
completion_append_character
と
completion_suppress_append
オプションのサポートが
readline_info() 関数に追加されました。
これらのオプションは PHP が (libedit ではなく) libreadline
とリンクされた場合のみ利用できます。
User Contributed Notes 1 note
"Trailing commas in function and method calls are now allowed" means function parameters, example:
<?php
function my1() {
echo "xxxxxx\n";
}
function my2() {
echo "yyyyyy\n";
}
my1(),my2(); // PHP Parse error: syntax error
my1(,); // PHP Parse error: syntax error
my1(1,); my2(2,); // OK
?>