此版本带来了一个重要的变化,指令 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() 函数现在接受可为空的 string 和 int 用于 $algo
参数。
默认情况下不再启用 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 中的变化相当显著。