## 新機能

### 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_convert_case() 関数で利用できます:

- `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" => "国"];
    ?>

これに加えて、 mb_ereg_replace() 関数は 置換文字列で名前付きキャプチャを参照するために `\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 とリンクされた場合のみ利用できます。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open