その他の変更
パフォーマンスの向上
PHP コア
array_key_exists() 関数で使うための特別な VM opcode
が追加されました。これにより、これが静的に解決される場合のパフォーマンスが向上します。名前空間内にあるコードは、
\array_key_exists()
を書くか、明示的に関数を import
する必要があるかもしれません。
正規表現 (Perl互換)
UTF-8モード("u"
修飾子)
が同じ文字列に対して繰り返し呼ばれた(但し異なるオフセットで呼ばれる)場合、UTF-8
として正しいかどうかの確認は一度だけ行われるようになります。
INIファイルのハンドリングに対する変更
zend.exception_ignore_args は、 例外から生成されたスタックトレースに引数を含めたり、除外したりするための新しい INIディレクティブです。
opcache.preload_user は、指定されなければ root として実行されてしまう場合(これはセキュリティ上の理由で禁止されています) に、事前ロードされたコードを実行するユーザーアカウントを指定するための新しいINIディレクティブです。
pkg-config への移行
たくさんの拡張モジュールが、ライブラリへの依存性を検知するために、明示的に
pkg-config に移行しました。一般的には、このことは 以前 --with-foo-dir=DIR
に似た指定をしていたのが、--with-foo
が使うだけで済むようになるということです。
カスタムライブラリのパスは PKG_CONFIG_PATH
にディレクトリを追加するか、明示的に FOO_CFLAGS
と
FOO_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を使う場合) になりました。
- --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 オプションは削除されました。 代わりに、バンドルされたものではなく、外部のPCREライブラリを使うために --with-external-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
パラメータに空文字列を受け入れるようになりました。
空文字列を指定すると、(RFC 4180 に準拠していない) 独自仕様の PHP のエスケープ機構が無効になります。
str_getcsv() 関数の振る舞いが適切に調整されました(正確には、空文字列がデフォルトを使うことに等しくなります)
SplFileObject::getCsvControl() は、3番目の配列要素で空文字列を返すように適切に調整されました。
データのフィルタリング
filter 拡張モジュールは、 Unix でビルドする際に --with-pcre-dir が不要になり、 ./configure コマンドで共有ライブラリとして確実にビルドされるようになりました。
GD
libgd にバンドルされた imagecropauto() 関数の振る舞いが、システムの libgd と同じになりました。
-
IMG_CROP_DEFAULT
は、IMG_CROP_SIDES
にフォールバックしなくなりました。 - Threshold-cropping は、システムの libgd のアルゴリズムを使うようになりました。
imagecropauto() 関数の $mode
引数のデフォルト値が IMG_CROP_DEFAULT
に変更されました。つまり、 -1
を渡すことは推奨されなくなりました。
imagescale() 関数が、$new_width
に
-1
を渡すことによって、
固定の高さのアスペクト比をサポートするようになりました。
LDAP
nsldap と umich_ldap のサポートは削除されました。
Libxml
すべての libxmlベースの拡張モジュールは libxml 2.7.6 以降が必須になりました。
マルチバイト文字列
oniguruma ライブラリは PHP本体にバンドルされなくなりました。代わりに、libonig がシステムで利用可能になっている必要があります。mbregex コンポーネントを無効にするために、--disable-mbregex オプションが代わりに利用できます。
OPcache
--disable-opcache-file と --enable-opcache-file オプションは削除され、opcache.file_cache INIディレクティブに置き換えられました。
パスワードハッシュ
password_hash() と
password_needs_rehash() 関数は、
$algo
に nullable な string と
int を受け入れるようになりました。
PEAR
PEAR (PECL を含む) のインストールは、デフォルトで無効になりました。configure オプション --with-pear を使うことで明示的に有効にできますが、このオプションは推奨されなくなり、将来的に削除される可能性があります。
リフレクション
ReflectionClass,
ReflectionFunction,
ReflectionMethod,
ReflectionObject,
ReflectionProperty
クラスの修飾子の定数の数値
(IS_ABSTRACT
,
IS_DEPRECATED
,
IS_EXPLICIT_ABSTRACT
,
IS_FINAL
,
IS_IMPLICIT_ABSTRACT
,
IS_PRIVATE
,
IS_PROTECTED
,
IS_PUBLIC
,
IS_STATIC
)
が変更されました。
SimpleXML
SimpleXMLElement クラスが、新たに Countable を実装しました。
SQLite3
バンドルされていた libsqlite は削除されました。 SQLite3 拡張モジュールをビルドするには、libsqlite3 3.7.4 以降が必須になりました。 PDO_SQLite 拡張モジュールをビルドするには、libsqlite3 3.5.0 以降が必須になりました。
SQLite3, SQLite3Stmt および SQLite3Result クラスのシリアル化とその復元は、明示的に禁止されました。 以前は、これらのクラスのシリアル化は可能でしたが、それを 復元すると不安定なオブジェクトを返していました。
@param
記法は
SQLクエリパラメータを示すために使えるようになりました。
Zip
バンドルされていた libzip ライブラリは削除されました。 zip 拡張モジュールをビルドするには、libzip >= 0.11 が必要になっています。
User Contributed Notes 3 notes
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.
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.
<?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';
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.