PHP 8.0.26 Released!



PHP 核心

array_key_exists() 函数添加了一个专门的 VM opcache 优化,如果该函数可以被静态解析,则可以提高该函数的性能。如果你在项目中使用了命名空间,可能会需要使用 \array_key_exists() 来显性的导入该函数。

正则表达式 (Perl-Compatible)

When preg_match() in UTF-8 mode ("u" modifier) is repeatedly called on the same string (but possibly different offsets), it will only be checked for UTF-8 validity once.

INI 配置文件处理的变化

zend.exception_ignore_args is a new INI directive for including or excluding arguments from stack traces generated from exceptions.

opcache.preload_user is a new INI directive for specifying the user account under which preloading code is execute if it would otherwise be run as root (which is not allowed for security reasons).

迁移到 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 now uses only pkg-config for libsystem checks. The libsystemd minimum required version is 209.
  • GD:
    • --with-gd 改变为 --enable-gd (whether to enable the extension at all) 和 --with-external-gd (to opt into using an external libgd, rather than the bundled one).
    • --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 without a directory now uses pkg-config (preferred). Directory is still accepted for old versions without libodbc.pc.
  • OpenSSL:
    • --with-openssl 选项不再接受一个目录。
  • PCRE:
    • --with-pcre-regex 被移除。Instead --with-external-pcre is provided to opt into using an external PCRE library, rather than the bundled one.
  • 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() 也可以相应的为第三个数组元素返回空字符串。


The filter extension no longer exposes --with-pcre-dir for Unix builds and can now reliably be built as shared when using ./configure


The behavior of imagecropauto() in the bundled libgd has been synced with that of system libgd:

  • IMG_CROP_DEFAULT is no longer falling back to IMG_CROP_SIDES
  • Threshold-cropping now uses the algorithm of system libgd

The default $mode parameter of imagecropauto() has been changed to IMG_CROP_DEFAULT; passing -1 is now deprecated.

imagescale() now supports aspect ratio preserving scaling to a fixed height by passing -1 as $new_width.

HASH Message Digest Framework

The hash extension cannot be disabled anymore and is always an integral part of any PHP build, similar to the date extension.


The intl extension now requires at least ICU 50.1.

ResourceBundle now implements Countable.


移除对 nsldap 和 umich_ldap 的支持。


All libxml-based extensions now require libxml 2.7.6 or newer.

Multibyte String

The oniguruma library is no longer bundled with PHP, instead libonig needs to be available on the system. Alternatively --disable-mbregex can be used to disable the mbregex component.


The --disable-opcache-file and --enable-opcache-file configure options have been removed in favor of the opcache.file_cache INI directive.


现在 password_hash()password_needs_rehash() 函数接受可以为 null 的字符串和 int 作为 $algo 参数。


Installation of PEAR (including PECL) is no longer enabled by default. It can be explicitly enabled using --with-pear. This option is deprecated and may be removed in the future.


The numeric values of the modifier constants (IS_ABSTRACT, IS_DEPRECATED, IS_EXPLICIT_ABSTRACT, IS_FINAL, IS_IMPLICIT_ABSTRACT, IS_PRIVATE, IS_PROTECTED, IS_PUBLIC, and IS_STATIC) on the ReflectionClass, ReflectionFunction, ReflectionMethod, ReflectionObject, and ReflectionProperty classes have changed.


SimpleXMLElement now implements Countable.


The bundled libsqlite has been removed. To build the SQLite3 extension a system libsqlite3 ≥ 3.7.4 is now required. To build the PDO_SQLite extension a system libsqlite3 ≥ 3.5.0 is now required.

Serialization and unserialization of SQLite3, SQLite3Stmt and SQLite3Result is now explicitly forbidden. Formerly, serialization of instances of these classes was possible, but unserialization yielded unusable objects.

The @param notation can now also be used to denote SQL query parameters.


The bundled libzip library has been removed. A system libzip >= 0.11 is now necessary to build the zip extension.

add a note

User Contributed Notes 3 notes

Florent H (Sowapps)
2 years ago
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.
ohcc at 163 dot com
2 years ago
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

$level, $error, $file, $line){
0 === error_reporting()){
            throw new
ErrorException($error, -1, $level, $file, $line);

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

// ... more code ...
santi at mola dot io
2 years ago
Note for internals/extensions:

Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.

While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
To Top