PHP 8.1.x で推奨されなくなる機能
PHP コア
__serialize(), __unserialize() がない状態で、 Serializable を実装するのは推奨されない
新しいこれらのメソッドだけを実装するか、 これらのメソッドをサポートしていない PHP 7.4 より前のバージョンでも使う場合は、 新旧両方のインターフェイスを実装すべきです。
ビルトイン関数の nullable でない引数に null
を渡した場合
ビルトイン関数のスカラー型の引数は、 デフォルトで nullable ですが、 この振る舞いは推奨されなくなりました。 ユーザ定義の関数においては、 スカラー型の引数は nullable と明示的にマークする必要があり、 その振る舞いと合わせるためです。
<?php
var_dump(str_contains("foobar", null));
// Deprecated: Passing null to parameter #2 ($needle) of type string
// is deprecated
?>
暗黙の float から int への変換
精度を損なうことになる float から int への暗黙の変換は、 推奨されなくなりました。 これは配列のキーに float を使った場合や、 型の自動変換 (coerciveモード) 時に int 型を宣言した場合や、 int に対して演算子を適用する場合に影響します。
<?php
$a = [];
$a[15.5]; // 推奨されません。0.5 がキーの値から失われるからです
$a[15.0]; // 15.0 == 15 なので OK
?>
トレイトの static な要素をコールする
トレイトにある static メソッドや、 static プロパティに直接アクセスすることは、 推奨されなくなりました。 これらは、トレイトを使っているクラスからのみアクセスすべきものです。
__sleep() から配列でない値を返す
配列でない値を __sleep() から返すと、警告が発生するようになりました。
void の関数からリファレンスを返す
<?php
function &test(): void {}
?>
Only variable references should be returned by reference
という E_NOTICE
が既に発生するようになっています。
false
な変数を自動的に復活させる挙動(Autovivification)
Autovivification とは、
値を追加しようとする際に配列を自動で生成する処理のことです。
スカラー型の値からこのような処理を行うことは禁止されていますが、
false
だけは例外でした。
このバージョンから、この例外も推奨されなくなります。
<?php
$arr = false;
$arr[] = 2; // 推奨されません
?>
注意:
null
や 未定義値から、 自動的に配列を生成する処理は未だ許可されています:<?php
// 未定義値から配列を生成
$arr[] = 'some value';
$arr['doesNotExist'][] = 2;
// null から配列を生成
$arr = null;
$arr[] = 2;
?>
ctype 関数
文字列でない引数の検証
ctype関数 に文字列でない引数を渡すことは、
推奨されなくなりました。
将来のバージョンでは、引数は ASCII コードポイントではなく、
文字列として解釈されるようになります。
ユーザが意図する振る舞いによっては、
引数を文字列にキャストするか、
chr()
を明示的にコールすべきです。
全ての ctype_*()
関数が影響を受けます。
日付・時刻 関数
date_sunrise() と date_sunset() は、推奨されなくなりました。 date_sun_info() を使って下さい。
strptime() 関数は、 推奨されなくなりました。 (ロケールに依存しないパースを行う場合) date_parse_from_format() または (ロケールに依存するパースを行う場合) IntlDateFormatter::parse() を代わりに使って下さい。
strftime() と gmstrftime() は、推奨されなくなりました。 (ロケールに依存しないフォーマットを行う場合) date() または (ロケールに依存するフォーマットを行う場合) IntlDateFormatter::format() を代わりに使って下さい。
Filter
FILTER_SANITIZE_STRING
と
FILTER_SANITIZE_STRIPPED
フィルタは、推奨されなくなりました。
INI ディレクティブ filter.default は、推奨されなくなりました。
GD
imagepolygon(),
imageopenpolygon(),
imagefilledpolygon()
の
num_points
引数は、
推奨されなくなりました。
Hash
mhash(),
mhash_keygen_s2k(),
mhash_count(),
mhash_get_block_size(),
mhash_get_hash_name()
は、推奨されなくなりました。
hash_*()
関数を代わりに使って下さい。
IMAP
定数 NIL
は、推奨されなくなりました。
0
を代わりに使って下さい。
国際化関数(Intl)
IntlCalendar::roll()
に bool 引数を渡してコールすることは、
推奨されなくなりました。
true
と false
の代わりに、
1
と -1
をそれぞれ渡すようにして下さい。
マルチバイト文字列
mb_check_encoding() 関数を引数を渡さずにコールすることは、推奨されなくなりました。
MySQLi
mysqli_driver::$driver_version
プロパティは、推奨されなくなりました。
このプロパティは意味がなく、時代遅れになっています。
PHP_VERSION_ID
を代わりに使って下さい。
mysqli
引数を渡して、
mysqli::get_client_info() や
mysqli_get_client_info()
をコールすることは、推奨されなくなりました。
クライアントライブラリのバージョン情報を取得するには、
mysqli_get_client_info()
を引数なしでコールするようにして下さい。
mysqli::init() メソッドは、 推奨されなくなりました。 parent::init() のコールを parent::__construct() に置き換えるようにして下さい。
OCI8
INI ディレクティブ oci8.old_oci_close_semantics は、推奨されなくなりました。
ODBC
odbc_result_all() 関数は推奨されなくなりました。
PDO
フェッチモードの定数 PDO::FETCH_SERIALIZE
は、推奨されなくなりました。
PgSQL
全ての
pgsql_*()
関数に対して、接続リソースを渡さないことは推奨されなくなりました。
SOAP
SoapClient::__construct()
の
ssl_method
オプションは推奨されなくなりました。
SSL コンテキストオプションを使うのが望ましいです。
標準ライブラリ
object に対して、 key(), current(), next(), prev(), reset(), end() を呼び出すことは推奨されなくなりました。 get_mangled_object_vars() を使って 最初に object を配列に変換するか、 ArrayIterator のような Iterator を実装したクラスのメソッドを使ってください。
INI ディレクティブ
auto_detect_line_endings
は、推奨されなくなりました。
必要な場合は、
"\r"
を手動で扱うようにして下さい。
定数
FILE_BINARY
と
FILE_TEXT
は推奨されなくなりました。
これらの定数は、使われたことがありませんでした。