新功能

PHP 核心

命名参数

已添加对 命名参数 的支持。

属性

已添加对 属性 的支持。

构造函数属性提升

已添加对 构造函数属性提升(在构造函数签名中声明属性)的支持。

联合类型

已添加对 联合类型 的支持。

匹配表达式

已添加对 match 表达式 的支持。

空安全运算符

已添加对 空安全运算符 (?->) 的支持。

其他新功能

  • 已添加 WeakMap 类。

  • 已添加 ValueError 类。

  • 现在,只要类型兼容,就可以用可变参数替换任意数量的函数参数。例如,以下代码现在允许:

    <?php
    class A {
    public function
    method(int $many, string $parameters, $here) {}
    }
    class
    B extends A {
    public function
    method(...$everything) {}
    }
    ?>

  • static(如“后期静态绑定”中所用)现在可以作为返回类型使用

    <?php
    class Test {
    public function
    create(): static {
    return new static();
    }
    }
    ?>

  • 现在可以使用 $object::class 获取对象的类名。结果与 get_class($object) 相同。

  • newinstanceof 现在可以与任意表达式一起使用,使用 new (expression)(...$args)$obj instanceof (expression)

  • 已对变量语法进行了一些一致性修复,例如,现在允许编写 Foo::BAR::$baz

  • 已添加 Stringable 接口,如果类定义了 __toString() 方法,则会自动实现该接口。

  • 特质现在可以定义抽象私有方法。使用特质的类必须实现此类方法。

  • throw 现在可以用作表达式。这允许像下面这样的用法:

    <?php
    $fn
    = fn() => throw new Exception('Exception in arrow function');
    $user = $session->user ?? throw new Exception('Must have user');

  • 参数列表中现在允许可选的尾随逗号。

    <?php
    function functionWithLongSignature(
    Type1 $parameter1,
    Type2 $parameter2, // <-- 此逗号现在允许。
    ) {
    }

  • 现在可以编写 catch (Exception) 来捕获异常,而无需将其存储在变量中。

  • 已添加对 mixed 类型的支持。

  • 父类上声明的私有方法不再对子类的方法强制执行任何继承规则(最终私有构造函数除外)。以下示例说明了哪些限制已删除

    <?php
    class ParentClass {
    private function
    method1() {}
    private function
    method2() {}
    private static function
    method3() {}
    // 抛出警告,因为 "final" 不再起作用:
    private final function method4() {}
    }
    class
    ChildClass extends ParentClass {
    // 以下所有内容现在都允许,即使修饰符与父类中的私有方法不同。
    // 与父类中的私有方法不同。
    public abstract function method1() {}
    public static function
    method2() {}
    public function
    method3() {}
    public function
    method4() {}
    }
    ?>

  • 已添加 get_resource_id(),它返回与 (int) $resource 相同的值。它在更清晰的 API 下提供相同的功能。

  • 已添加 InternalIterator

日期和时间

DOM

已添加 DOMParentNodeDOMChildNode,它们具有新的遍历和操作 API。

过滤器

FILTER_VALIDATE_BOOL 已添加为 FILTER_VALIDATE_BOOLEAN 的别名。新名称更受欢迎,因为它使用规范的类型名称。

FPM

添加了一个新选项 pm.status_listen,它允许从不同的端点(例如端口或 UDS 文件)获取状态,这对于在所有子进程都忙于为长时间运行的请求提供服务时获取状态很有用。

哈希

现在可以序列化 HashContext 对象。

LDAP

已添加 ldap_count_references(),它返回搜索结果中的引用消息数。

OPcache

如果启用 opcache.record_warnings ini 设置,OPcache 将记录编译时警告,并在下次包含时重放这些警告,即使是从缓存中提供的。

OpenSSL

添加了加密消息语法 (CMS) (» RFC 5652) 支持,它由用于加密、解密、签名、验证和读取的函数组成。该 API 类似于 PKCS #7 函数的 API,但添加了新的编码常量:OPENSSL_ENCODING_DEROPENSSL_ENCODING_SMIMEOPENSSL_ENCODING_PEM

正则表达式 (Perl 兼容)

preg_last_error_msg() 已添加,它返回上次 PCRE 错误的人类可读消息。它补充了 preg_last_error(),它返回整数枚举值。

SQLite3

SQLite3::setAuthorizer() 和相应的类常量已添加,用于设置用户级回调,该回调将用于授权或拒绝对数据库的操作。

标准库

  • str_contains()str_starts_with()str_ends_with() 已添加,它们分别检查 haystack 是否包含、以 needle 开头或以 needle 结尾。

  • fdiv() 已添加,它根据 IEEE 754 语义执行浮点除法。除以零被认为是定义明确的,并将返回 Inf-InfNaN 之一。

  • get_debug_type() 已添加,它返回对错误消息有用的类型。与 gettype() 不同,它使用规范类型名称,为对象返回类名称,并为资源指示资源类型。

  • printf() 及其朋友现在支持 %h%H 格式说明符。它们与 %g%G 相同,但始终使用 "." 作为小数点分隔符,而不是通过 LC_NUMERIC 区域设置来确定。

  • printf() 及其朋友现在支持使用 "*" 作为宽度或精度,在这种情况下,宽度/精度将作为参数传递给 printf。这也允许在使用 %g%G%h%H 时使用精度 -1。例如,以下代码可用于复制 PHP 的默认浮点数格式

    <?php
    printf
    ("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);
    ?>

  • proc_open() 现在支持伪终端 (PTY) 描述符。以下将 stdinstdoutstderr 附加到同一个 PTY

    <?php
    $proc
    = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
    ?>

  • proc_open() 现在支持套接字对描述符。以下将一个独立的套接字对附加到 stdinstdoutstderr

    <?php
    $proc
    = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
    ?>

    与管道不同,套接字不会在 Windows 上遇到阻塞 I/O 问题。但是,并非所有程序都能与 stdio 套接字正常工作。

  • 排序函数现在是稳定的,这意味着比较相等的元素将保留其原始顺序。

  • array_diff()array_intersect() 及其变体现在可以使用单个数组作为参数。这意味着现在可以使用以下用法

    <?php
    // 即使 $excludes 为空,也是有效的:
    array_diff($array, ...$excludes);
    // 即使 $arrays 只包含一个数组,也是有效的:
    array_intersect(...$arrays);
    ?>

  • ob_implicit_flush()flag 参数已更改为接受 bool 而不是 int

词法分析器

PhpToken 向词法分析器添加了基于对象的接口。它提供了一种更统一、更符合人体工程学的方式,同时更节省内存,速度更快。

Zip

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top