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_sunrisedate_sunset は、推奨されなくなりました。 date_sun_info を使って下さい。

strptime 関数は、 推奨されなくなりました。 (ロケールに依存しないパースを行う場合) date_parse_from_format または (ロケールに依存するパースを行う場合) IntlDateFormatter::parse を代わりに使って下さい。

strftimegmstrftime は、推奨されなくなりました。 (ロケールに依存しないフォーマットを行う場合) date または (ロケールに依存するフォーマットを行う場合) IntlDateFormatter::format を代わりに使って下さい。

Filter

FILTER_SANITIZE_STRINGFILTER_SANITIZE_STRIPPED フィルタは、推奨されなくなりました。

INI ディレクティブ filter.default は、推奨されなくなりました。

GD

imagepolygon, imageopenpolygon, imagefilledpolygonnum_points 引数は、 推奨されなくなりました。

Hash

mhash, mhash_keygen_s2k, mhash_count, mhash_get_block_size, mhash_get_hash_name は、推奨されなくなりました。 hash_*() 関数を代わりに使って下さい。

IMAP

定数 NIL は、推奨されなくなりました。 0 を代わりに使って下さい。

国際化関数(Intl)

IntlCalendar::rollbool 引数を渡してコールすることは、 推奨されなくなりました。 truefalse の代わりに、 1-1 をそれぞれ渡すようにして下さい。

マルチバイト文字列

mb_check_encoding 関数を引数を渡さずにコールすることは、推奨されなくなりました。

MySQLi

mysqli_driver::$driver_version プロパティは、推奨されなくなりました。 このプロパティは意味がなく、時代遅れになっています。 PHP_VERSION_ID を代わりに使って下さい。

mysqli 引数を渡して、 mysqli::get_client_infomysqli_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::__constructssl_method オプションは推奨されなくなりました。 SSL コンテキストオプションを使うのが望ましいです。

標準ライブラリ

object に対して、 key, current, next, prev, reset, end を呼び出すことは推奨されなくなりました。 get_mangled_object_vars を使って 最初に object を配列に変換するか、 ArrayIterator のような Iterator を実装したクラスのメソッドを使ってください。

INI ディレクティブ auto_detect_line_endings は、推奨されなくなりました。 必要な場合は、 "\r" を手動で扱うようにして下さい。

定数 FILE_BINARYFILE_TEXT は推奨されなくなりました。 これらの定数は、使われたことがありませんでした。