此版本在指令 zend.exception_ignore_args 默认设置为 On 方面带来了重要变化。
在所有堆栈跟踪中,args 键现在都消失了。
所有 PHP 框架都必须处理此问题才能报告错误和异常。
添加了一个专门的 VM 操作码用于 array_key_exists() 函数,如果可以静态解析,则会提高此函数的性能。在命名空间代码中,这可能需要编写 \array_key_exists()
或显式导入该函数。
当 preg_match() 在 UTF-8 模式("u"
修饰符)下重复调用同一个字符串(但可能是不同的偏移量)时,只会检查一次 UTF-8 有效性。
zend.exception_ignore_args 是一个新的 INI 指令,用于包含或排除从异常生成的堆栈跟踪中的参数。
opcache.preload_user 是一个新的 INI 指令,用于指定预加载代码执行的用户帐户,如果否则会以 root 身份运行(出于安全原因不允许)。
许多扩展已迁移到仅使用 pkg-config 来检测库依赖项。通常,这意味着不再使用 --with-foo-dir=DIR 或类似的选项,而仅使用 --with-foo。自定义库路径可以通过将其他目录添加到 PKG_CONFIG_PATH
或通过 FOO_CFLAGS
和 FOO_LIBS
显式指定编译选项来指定。
受影响的扩展和 SAPI 如下
fputcsv()、fgetcsv()、SplFileObject::fputcsv()、SplFileObject::fgetcsv() 和 SplFileObject::setCsvControl() 现在接受空字符串作为 $escape
参数,这将禁用专有的 PHP 转义机制。
str_getcsv() 的行为已相应调整(以前,空字符串与使用默认值相同)。
SplFileObject::getCsvControl() 现在也可能相应地为第三个数组元素返回空字符串。
filter 扩展不再为 Unix 构建公开 --with-pcre-dir,并且现在在使用 ./configure 时可以可靠地作为共享构建。
捆绑的 libgd 中 imagecropauto() 的行为已与系统 libgd 的行为同步。
IMG_CROP_DEFAULT
不再回退到 IMG_CROP_SIDES
imagecropauto() 的默认 $mode
参数已更改为 IMG_CROP_DEFAULT
;现在已弃用传递 -1
。
imagescale() 现在支持通过将 -1
作为 $new_width
传递来按比例缩放以固定高度。
已删除对 nsldap 和 umich_ldap 的支持。
所有基于 libxml 的扩展现在都需要 libxml 2.7.6 或更高版本。
oniguruma 库不再与 PHP 捆绑在一起,而是需要在系统上提供 libonig。或者可以使用 --disable-mbregex 禁用 mbregex 组件。
已删除 --disable-opcache-file 和 --enable-opcache-file 配置选项,取而代之的是 opcache.file_cache INI 指令。
password_hash() 和 password_needs_rehash() 函数现在接受 $algo
参数的可空 string 和 int。
不再默认启用 PEAR(包括 PECL)的安装。可以使用 --with-pear 显式启用它。此选项已弃用,可能会在将来删除。
修饰符常量(IS_ABSTRACT
、IS_DEPRECATED
、IS_EXPLICIT_ABSTRACT
、IS_FINAL
、IS_IMPLICIT_ABSTRACT
、IS_PRIVATE
、IS_PROTECTED
、IS_PUBLIC
和 IS_STATIC
)在 ReflectionClass、ReflectionFunction、ReflectionMethod、ReflectionObject 和 ReflectionProperty 类上的数值已更改。
SimpleXMLElement 现在实现了 Countable 接口。
捆绑的 libsqlite 已被移除。要构建 SQLite3 扩展,现在需要系统 libsqlite3 ≥ 3.7.4。要构建 PDO_SQLite 扩展,现在需要系统 libsqlite3 ≥ 3.5.0。
SQLite3、SQLite3Stmt 和 SQLite3Result 的序列化和反序列化现在被明确禁止。以前,这些类的实例可以被序列化,但反序列化会产生不可用的对象。
@param
符号现在也可以用于表示 SQL 查询参数。
捆绑的 libzip 库已被移除。现在需要系统 libzip >= 0.11 才能构建 zip 扩展。
此版本在指令 zend.exception_ignore_args 默认设置为 On 方面带来了重要变化。
在所有堆栈跟踪中,args 键现在都消失了。
所有 PHP 框架都必须处理此问题才能报告错误和异常。
从 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';
内部/扩展说明
PHP 7.3 和 7.4 之间许多操作码值发生了变化,因此大多数文档资源在这方面都已过时。您可以在 php-src 中的 Zend/zend_vm_opcodes.h 中查看定义。例如,ZEND_ECHO 从 40 更改为 136。
虽然操作码更改在许多 PHP 版本中都会发生,但 7.4 中的更改非常显著。