PHPのお勉強!

PHP TOP

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_STRINGFILTER_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 引数を渡してコールすることは、 推奨されなくなりました。 truefalse の代わりに、 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_BINARYFILE_TEXT は推奨されなくなりました。 これらの定数は、使われたことがありませんでした。

add a note

User Contributed Notes

There are no user contributed notes for this page.