PHP 8.5.x で推奨されなくなる機能
PHP コア
ユーザー定義の出力ハンドラに関する変更
ユーザー定義の出力ハンドラから(たとえば echo
などを使って) 出力を行うことは、推奨されなくなりました。
この推奨されない警告は、
出力を生成するハンドラをバイパスして、
それが確実に表示されるようにします。
つまり、ネストされた出力ハンドラが存在する場合、
次のハンドラは引き続き使われるということです。
正規化されていない型名でのキャスト
正規化されていない型名
(boolean),
(integer),
(double),
(binary) でキャストすることは、
推奨されなくなりました。
(bool), (int),
(float), (string)
をそれぞれ使ってください。
セミコロンでcase文を終了させる
case文をコロンではなく、セミコロンで終了させることは、
推奨されなくなりました。
バッククォート演算子
shell_exec
のエイリアスとして使われている
バッククォート演算子
は、推奨されなくなりました。
__debugInfo() から null を返す
__debugInfo()
から null を返すことは、推奨されなくなりました。
空の配列を返してください。
定数の再宣言
同じ定数を再宣言することは、推奨されなくなりました。
これについては既に警告は発生しており、
(警告の種類が変わるだけで)それが続くことに注意してください。
クロージャのバインド時の問題
既に E_WARNING が発生している、
クロージャのバインド時の以下の問題は、推奨されなくなりました:
- インスタンスを static なクロージャにバインドすること
- メソッドが定義されているクラス(またはサブクラス)のインスタンスでないオブジェクトに、メソッドをバインドすること
- メソッドから $this のバインドを解除すること
- `$this` を使っているクロージャから、$this のバインドを解除すること
- 内部クラスのスコープにクロージャをバインドすること
- 関数やメソッドから生成したクロージャのスコープを、再度バインドすること
配列のオフセットに null を指定
配列のオフセットに null を指定したり、
array_key_exists をコールする際に null を指定することは、
推奨されなくなりました。
代わりに、空文字列を使ってください。
数値でない文字列をインクリメント
数値でない文字列をインクリメントすることは、推奨されなくなりました。
str_increment を代わりに使ってください。
register_argc_argv INI ディレクティブ
CLI でない SAPI において、
クエリ文字列から $_SERVER['argc'] と
$_SERVER['argv'] の値を取得する機能は、
推奨されなくなりました。
安全な使い方を検証した上で register_argc_argv=0
を設定し、情報を取得する手段を $_GET や
$_SERVER['QUERY_STRING'] に切り替えてください。
cURL
curl_close 関数は、推奨されなくなりました。
CurlHandle オブジェクトが、
自動でリソースを開放するためです。
curl_share_close 関数は、推奨されなくなりました。
CurlShareHandle オブジェクトが、
自動でリソースを開放するためです。
Date
定数 DATE_RFC7231 と
DateTimeInterface::RFC7231
は、推奨されなくなりました。
これらに関連付けられているタイムゾーンは無視され、
常に GMT を使っているためです。
FileInfo
finfo_close 関数は、推奨されなくなりました。
finfo オブジェクトが、
自動でリソースを開放するためです。
finfo_buffer 関数の $context
パラメータは、推奨されなくなりました。
このパラメータは無視されているためです。
GD
imagedestroy 関数は、推奨されなくなりました。
GdImage オブジェクトが、
自動でリソースを開放するためです。
Hash
MHASH_* 定数は、
推奨されなくなりました。
LDAP
特定の Oracle Instant Client の呼び出しや定数は、
推奨されなくなりました。
影響を受ける呼び出しは以下の通りです:
- wallet のサポートを使った ldap_connect
- ldap_connect_wallet
影響を受ける定数は以下の通りです:
GSLC_SSL_NO_UATH
GSLC_SSL_ONEWAY_UATH
GSLC_SSL_TWOWAY_UATH
MySQLi
エイリアスとして定義されている
mysqli_execute 関数は、
推奨されなくなりました。
代わりに mysqli_stmt_execute を使いましょう。
OpenSSL
openssl_pkey_derive の $key_length
パラメータは、推奨されなくなりました。
このパラメータは無視されているか、キーを切り捨てるかしており、
それらの挙動がセキュリティ上の脆弱性になりうるためです。
PDO
"uri:" DSN スキームは、推奨されなくなりました。
リモートURI から生じる、DSN に関するセキュリティ上の懸念があるためです。
PDO クラスのドライバ特有の定数は、推奨されなくなりました。
影響を受ける定数と、代替は以下のとおりです:
PDO::DBLIB_ATTR_CONNECTION_TIMEOUT => Pdo\Dblib::ATTR_CONNECTION_TIMEOUT
PDO::DBLIB_ATTR_QUERY_TIMEOUT => Pdo\Dblib::ATTR_QUERY_TIMEOUT
PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
PDO::DBLIB_ATTR_VERSION => Pdo\Dblib::ATTR_VERSION
PDO::DBLIB_ATTR_TDS_VERSION => Pdo\Dblib::ATTR_TDS_VERSION
PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS => Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS
PDO::DBLIB_ATTR_DATETIME_CONVERT => Pdo\Dblib::ATTR_DATETIME_CONVERT
PDO::FB_ATTR_DATE_FORMAT => Pdo\Firebird::ATTR_DATE_FORMAT
PDO::FB_ATTR_TIME_FORMAT => Pdo\Firebird::ATTR_TIME_FORMAT
PDO::FB_ATTR_TIMESTAMP_FORMAT => Pdo\Firebird::ATTR_TIMESTAMP_FORMAT
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => Pdo\Mysql::ATTR_USE_BUFFERED_QUERY
PDO::MYSQL_ATTR_LOCAL_INFILE => Pdo\Mysql::ATTR_LOCAL_INFILE
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY => Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY
PDO::MYSQL_ATTR_INIT_COMMAND => Pdo\Mysql::ATTR_INIT_COMMAND
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => Pdo\Mysql::ATTR_MAX_BUFFER_SIZE
PDO::MYSQL_ATTR_READ_DEFAULT_FILE => Pdo\Mysql::ATTR_READ_DEFAULT_FILE
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => Pdo\Mysql::ATTR_READ_DEFAULT_GROUP
PDO::MYSQL_ATTR_COMPRESS => Pdo\Mysql::ATTR_COMPRESS
PDO::MYSQL_ATTR_DIRECT_QUERY => Pdo\Mysql::ATTR_DIRECT_QUERY
PDO::MYSQL_ATTR_FOUND_ROWS => Pdo\Mysql::ATTR_FOUND_ROWS
PDO::MYSQL_ATTR_IGNORE_SPACE => Pdo\Mysql::ATTR_IGNORE_SPACE
PDO::MYSQL_ATTR_SSL_KEY => Pdo\Mysql::ATTR_SSL_KEY
PDO::MYSQL_ATTR_SSL_CERT => Pdo\Mysql::ATTR_SSL_CERT
PDO::MYSQL_ATTR_SSL_CA => Pdo\Mysql::ATTR_SSL_CA
PDO::MYSQL_ATTR_SSL_CAPATH => Pdo\Mysql::ATTR_SSL_CAPATH
PDO::MYSQL_ATTR_SSL_CIPHER => Pdo\Mysql::ATTR_SSL_CIPHER
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT
PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY => Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY
PDO::MYSQL_ATTR_MULTI_STATEMENTS => Pdo\Mysql::ATTR_MULTI_STATEMENTS
PDO::ODBC_ATTR_USE_CURSOR_LIBRARY => Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY
PDO::ODBC_ATTR_ASSUME_UTF8 => Pdo\Odbc::ATTR_ASSUME_UTF8
PDO::ODBC_SQL_USE_IF_NEEDED => Pdo\Odbc::SQL_USE_IF_NEEDED
PDO::ODBC_SQL_USE_DRIVER => Pdo\Odbc::SQL_USE_DRIVER
PDO::ODBC_SQL_USE_ODBC => Pdo\Odbc::SQL_USE_ODBC
PDO::PGSQL_ATTR_DISABLE_PREPARES => Pdo\Pgsql::ATTR_DISABLE_PREPARES
PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES => Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES
PDO::SQLITE_ATTR_OPEN_FLAGS => Pdo\Sqlite::OPEN_FLAGS
PDO::SQLITE_ATTR_READONLY_STATEMENT => Pdo\Sqlite::ATTR_READONLY_STATEMENT
PDO::SQLITE_DETERMINISTIC => Pdo\Sqlite::DETERMINISTIC
PDO::SQLITE_OPEN_READONLY => Pdo\Sqlite::OPEN_READONLY
PDO::SQLITE_OPEN_READWRITE => Pdo\Sqlite::OPEN_READWRITE
PDO::SQLITE_OPEN_CREATE => Pdo\Sqlite::OPEN_CREATE
PDO クラスのドライバ特有のメソッドは、推奨されなくなりました。
影響を受けるメソッドと、代替は以下のとおりです:
- PDO::pgsqlCopyFromArray => Pdo\Pgsql::copyFromArray
- PDO::pgsqlCopyFromFile => Pdo\Pgsql::copyFromFile
- PDO::pgsqlCopyToArray => Pdo\Pgsql::copyToArray
- PDO::pgsqlCopyToFile => Pdo\Pgsql::copyToFile
- PDO::pgsqlGetNotify => Pdo\Pgsql::getNotify
- PDO::pgsqlGetPid => Pdo\Pgsql::getPid
- PDO::pgsqlLOBCreate => Pdo\Pgsql::lobCreate
- PDO::pgsqlLOBOpen => Pdo\Pgsql::lobOpen
- PDO::pgsqlLOBUnlink => Pdo\Pgsql::lobUnlink
- PDO::sqliteCreateAggregate => Pdo\Sqlite::createAggregate
- PDO::sqliteCreateCollation => Pdo\Sqlite::createCollation
- PDO::sqliteCreateFunction => Pdo\Sqlite::createFunction
PDO_PGSQL
トランザクションの状態に関連する以下の定数は、推奨されなくなりました。
この機能は PDO で利用できなくなっているからです:
PDO::PGSQL_TRANSACTION_IDLE
PDO::PGSQL_TRANSACTION_ACTIVE
PDO::PGSQL_TRANSACTION_INTRANS
PDO::PGSQL_TRANSACTION_INERROR
PDO::PGSQL_TRANSACTION_UNKNOWN
Reflection
リフレクション関連の様々な setAccessible() メソッドは、
推奨されなくなりました。
使っても効果がないためです。
存在しない定数に対して、
ReflectionClass::getConstant
をコールすることは、推奨されなくなりました。
デフォルト値が存在しないプロパティに対して、
ReflectionProperty::getDefaultValue
をコールすることは、推奨されなくなりました。
SPL
spl_autoload_call を
spl_autoload_unregister
のコールバック引数に渡すことで、
すべての autoload の登録を解除することは、推奨されなくなりました。
代わりに、spl_autoload_functions
の戻り値を反復処理し、
それぞれの値に対して spl_autoload_unregister
をコールする必要があります。
SplObjectStorage::contains,
SplObjectStorage::attach,
SplObjectStorage::detach
は、推奨されなくなりました。
SplObjectStorage::offsetExists,
SplObjectStorage::offsetSet,
SplObjectStorage::offsetUnset
をそれぞれ使ってください。
オブジェクトと一緒に
ArrayObject と
ArrayIterator を使うことは、
推奨されなくなりました。
Standard
エイリアスとして定義されている
socket_set_timeout 関数は、
推奨されなくなりました。
代わりに stream_set_timeout を使いましょう。
最後にオープンしたディレクトリを使う目的で、
readdir,
rewinddir,
closedir に null を渡すことは、
推奨されなくなりました。
最後にオープンしたディレクトリを明示的に指定してください。
chr に、
区間 [0, 255] の範囲にない数値を指定することは、
推奨されなくなりました。
1バイトのデータは、この範囲でのみ保持できるからです。
シングルバイトでない文字列を ord に渡すことは、
推奨されなくなりました。
こうすることは、バグであることを示唆しています。
ローカルで事前に定義済みの変数
$http_response_header
は、推奨されなくなりました。代わりに、
http_get_last_response_headers をコールすべきです。
XML
xml_parser_free 関数は、推奨されなくなりました。
XMLParser オブジェクトが、
自動でリソースを開放するためです。