## 新特性

### PHP 核心

#### 更灵活的 Heredoc 和 Nowdoc 语法

Heredoc 和 Nowdoc 语法变的更灵活。现在支持闭合标记符的缩进，并且不再强制闭合标记符的换行。

#### 数组解构支持引用赋值

数组解构现在支持使用语法 `[&$a, [$b, &$c]] = $d` 进行引用赋值。list() 也支持同样的操作。

#### Instanceof 操作符接受字面量

`instanceof` 现在允许字面量作为第一个操作数，在这种情况下，结果始终为 `false`。

#### 一些编译错误替换为 CompileError 异常

新增 CompileError 异常，ParseError 继承该异常。现在，少量编译错误将抛出 CompileError，而不是生成致命错误。目前仅影响 `TOKEN_PARSE` 模式下 token_get_all() 可能抛出的编译错误，但将来可能会转换更多错误。

#### 调用中允许尾随逗号

现在允许在函数和方法调用中使用尾随逗号。

#### Argon2id 支持

--with-password-argon2[=dir] 配置参数现在提供了对 password_hash()、password_verify()、password_get_info() 和 password_needs_rehash() 函数的 Argon2i 和Argon2id 散列支持。可以使用 `PASSWORD_ARGON2ID` 常量对密码进行散列处理和验证。password_*() 函数现在对 Argon2i 和 Argon2id 的支持要求 PHP 链接的 libargon2 引用 library ≥ 20161029。

### FastCGI 进程管理器

新增了自定义 FPM 日志记录的新选项：

`log_limit`
  此全局选项可用于设置日志记录的行限制，允许记录长度超过 1024 个字符的消息而不换行。还修复了各种封装器问题。
`log_buffering`
  此全局选项实验性允许无需额外缓冲的日志记录。
`decorate_workers_output`
  当启用 `catch_workers_output` 时，此 pool 选项允许禁用 worker 输出的输出装饰器。

### BC 数学函数

bcscale() 现在可以用于检索当前使用的精度。

### 轻量目录访问协议

LDAP 查询函数和 ldap_parse_result() 已新增对 LDAP 控件的完全支持：

- 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() 新增输出参数 `$controls` 用于从服务器中获取控件。
- 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 执行标题大小写转换

mb_convert_case() 现在使用 `MB_CASE_TITLE` 基于 Unicode 属性衍生的 Cased 和 CaseIgnorable 执行标题大小写转换。尤其是还改进了对引号和撇号的处理。

#### 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<>` 和 `\k''` 也可用于编号引用，组编号大于 9 也适用。

### Readline

readline_info() 中新增对 `completion_append_character` 和 `completion_suppress_append` 选项的支持。仅当 PHP 链接到 libreadline（而不是 libedit）时，这些选项才可用。

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