PHP Conference Japan 2024

其他更改

性能改进

PHP 核心

添加了一个专门的 VM 操作码用于 array_key_exists() 函数,如果可以静态解析,则会提高此函数的性能。在命名空间代码中,这可能需要编写 \array_key_exists() 或显式导入该函数。

正则表达式(Perl 兼容)

preg_match() 在 UTF-8 模式("u" 修饰符)下重复调用同一个字符串(但可能是不同的偏移量)时,只会检查一次 UTF-8 有效性。

INI 文件处理的更改

zend.exception_ignore_args 是一个新的 INI 指令,用于包含或排除从异常生成的堆栈跟踪中的参数。

opcache.preload_user 是一个新的 INI 指令,用于指定预加载代码执行的用户帐户,如果否则会以 root 身份运行(出于安全原因不允许)。

迁移到 pkg-config

许多扩展已迁移到仅使用 pkg-config 来检测库依赖项。通常,这意味着不再使用 --with-foo-dir=DIR 或类似的选项,而仅使用 --with-foo。自定义库路径可以通过将其他目录添加到 PKG_CONFIG_PATH 或通过 FOO_CFLAGSFOO_LIBS 显式指定编译选项来指定。

受影响的扩展和 SAPI 如下

  • CURL
    • --with-curl 不再接受目录。
  • Enchant
    • --with-enchant 不再接受目录。
  • FPM
    • --with-fpm-systemd 现在仅使用 pkg-config 进行 libsystem 检查。libsystemd 的最低要求版本为 209。
  • GD
    • --with-gd 变为 --enable-gd(是否完全启用扩展)和 --with-external-gd(选择使用外部 libgd 而不是捆绑的 libgd)。
    • --with-png-dir 已删除。libpng 是必需的。
    • --with-zlib-dir 已删除。zlib 是必需的。
    • --with-freetype-dir 变为 --with-freetype
    • --with-jpeg-dir 变为 --with-jpeg
    • --with-webp-dir 变为 --with-webp
    • --with-xpm-dir 变为 --with-xpm
  • IMAP
    • --with-kerberos-systemd 不再接受目录。
  • Intl
    • --with-icu-dir 已删除。如果传递了 --enable-intl,则始终需要 libicu。
  • LDAP
    • --with-ldap-sasl 不再接受目录。
  • Libxml
    • --with-libxml-dir 已删除。
    • --enable-libxml 变为 --with-libxml
    • --with-libexpat-dir 已重命名为 --with-expat 并且不再接受目录。
  • Litespeed
    • --with-litespeed 变为 --enable-litespeed
  • Mbstring
    • --with-onig 已删除。除非传递了 --disable-mbregex,否则需要 libonig。
  • ODBC
    • --with-iodbc 不再接受目录。
    • --with-unixODBC 不带目录现在使用 pkg-config(首选)。目录仍被接受,用于没有 libodbc.pc 的旧版本。
  • OpenSSL
    • --with-openssl 不再接受目录。
  • PCRE
    • --with-pcre-regex 已删除。相反,提供了 --with-external-pcre 来选择使用外部 PCRE 库而不是捆绑的库。
  • PDO_SQLite
    • --with-pdo-sqlite 不再接受目录。
  • Readline
    • --with-libedit 不再接受目录。
  • Sodium
    • --with-sodium 不再接受目录。
  • SQLite3
    • --with-sqlite3 不再接受目录。
  • XSL
    • --with-xsl 不再接受目录。
  • Zip
    • --with-libzip 已删除。
    • --enable-zip 变为 --with-zip

CSV 转义

fputcsv()fgetcsv()SplFileObject::fputcsv()SplFileObject::fgetcsv()SplFileObject::setCsvControl() 现在接受空字符串作为 $escape 参数,这将禁用专有的 PHP 转义机制。

str_getcsv() 的行为已相应调整(以前,空字符串与使用默认值相同)。

SplFileObject::getCsvControl() 现在也可能相应地为第三个数组元素返回空字符串。

数据过滤

filter 扩展不再为 Unix 构建公开 --with-pcre-dir,并且现在在使用 ./configure 时可以可靠地作为共享构建。

GD

捆绑的 libgd 中 imagecropauto() 的行为已与系统 libgd 的行为同步。

imagecropauto() 的默认 $mode 参数已更改为 IMG_CROP_DEFAULT;现在已弃用传递 -1

imagescale() 现在支持通过将 -1 作为 $new_width 传递来按比例缩放以固定高度。

HASH 消息摘要框架

hash 扩展不再可以禁用,并且始终是任何 PHP 构建的组成部分,类似于 date 扩展。

Intl

intl 扩展现在至少需要 ICU 50.1。

ResourceBundle 现在实现了 Countable

轻量级目录访问协议

已删除对 nsldap 和 umich_ldap 的支持。

Libxml

所有基于 libxml 的扩展现在都需要 libxml 2.7.6 或更高版本。

多字节字符串

oniguruma 库不再与 PHP 捆绑在一起,而是需要在系统上提供 libonig。或者可以使用 --disable-mbregex 禁用 mbregex 组件。

OPcache

已删除 --disable-opcache-file--enable-opcache-file 配置选项,取而代之的是 opcache.file_cache INI 指令。

密码哈希

password_hash()password_needs_rehash() 函数现在接受 $algo 参数的可空 stringint

PEAR

不再默认启用 PEAR(包括 PECL)的安装。可以使用 --with-pear 显式启用它。此选项已弃用,可能会在将来删除。

反射

修饰符常量(IS_ABSTRACTIS_DEPRECATEDIS_EXPLICIT_ABSTRACTIS_FINALIS_IMPLICIT_ABSTRACTIS_PRIVATEIS_PROTECTEDIS_PUBLICIS_STATIC)在 ReflectionClassReflectionFunctionReflectionMethodReflectionObjectReflectionProperty 类上的数值已更改。

SimpleXML

SimpleXMLElement 现在实现了 Countable 接口。

SQLite3

捆绑的 libsqlite 已被移除。要构建 SQLite3 扩展,现在需要系统 libsqlite3 ≥ 3.7.4。要构建 PDO_SQLite 扩展,现在需要系统 libsqlite3 ≥ 3.5.0。

SQLite3SQLite3StmtSQLite3Result 的序列化和反序列化现在被明确禁止。以前,这些类的实例可以被序列化,但反序列化会产生不可用的对象。

@param 符号现在也可以用于表示 SQL 查询参数。

Zip

捆绑的 libzip 库已被移除。现在需要系统 libzip >= 0.11 才能构建 zip 扩展。

添加注释

用户贡献注释 3 条注释

2
Florent H (Sowapps)
4 年前
此版本在指令 zend.exception_ignore_args 默认设置为 On 方面带来了重要变化。
在所有堆栈跟踪中,args 键现在都消失了。
所有 PHP 框架都必须处理此问题才能报告错误和异常。
1
ohcc at 163 dot com
4 年前
从 PHP 7.4 开始,在用户定义的关闭函数中抛出的异常可以被用户定义的异常处理程序捕获。

<?php
set_error_handler
(
function(
$level, $error, $file, $line){
if(
0 === error_reporting()){
return
false;
}
throw new
ErrorException($error, -1, $level, $file, $line);
},
E_ALL
);

register_shutdown_function(function(){
$error = error_get_last();
if(
$error){
throw new
ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
}
});

set_exception_handler(function($exception){
// ... more code ...
});

require
'NotExists.php';
-1
santi at mola dot io
4 年前
内部/扩展说明

PHP 7.3 和 7.4 之间许多操作码值发生了变化,因此大多数文档资源在这方面都已过时。您可以在 php-src 中的 Zend/zend_vm_opcodes.h 中查看定义。例如,ZEND_ECHO 从 40 更改为 136。

虽然操作码更改在许多 PHP 版本中都会发生,但 7.4 中的更改非常显著。
To Top