其他变更

性能改进

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() 函数现在接受可为空的 stringint 用于 $algo 参数。

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';
0
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