PHP Conference Japan 2024

新特性

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

  • openssl_cms_encrypt() 使用证书加密文件中的消息,并将结果输出到提供的文件中。
  • openssl_cms_decrypt() 解密文件中的 S/MIME 消息,并将结果输出到提供的文件中。
  • openssl_cms_read() 将 CMS 文件导出到 PEM 证书的数组中。
  • openssl_cms_sign() 使用证书和密钥对文件中的 MIME 消息进行签名,并将结果输出到提供的文件中。
  • openssl_cms_verify() 验证数据块是否完整,签名者是否为其声称的身份,并返回签名者的证书。

正则表达式 (Perl 兼容)

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

SQLite3

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

标准库

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

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

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

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

  • printf() 及其相关函数现在支持使用 "*" 作为宽度或精度,在这种情况下,宽度/精度将作为参数传递给 printf。这也允许使用精度 -1%g%G%h%H 一起使用。例如,以下代码可用于重现 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