推奨されなくなる機能

PHP コア

  • デフォルト値を持つ引数の後に、必須の引数が続く場合、デフォルト値は意味をなしません。 こうした書き方は PHP 8.0.0 から推奨されなくなります。 以下のようにしてデフォルト値を削除することで、機能を変更することなく解決できます:

    <?php
    function test($a = [], $b) {} // 変更前
    function test($a, $b) {}      // 変更後
    ?>

    このルールの唯一の例外は、Type $param = null と書かれた引数です。 null をデフォルトにすることは、型が暗黙のうちに nullable であることを示しています。 この書き方はまだ許可されていますが、以下のようにして 明示的に nullable 型を使うことを推奨します:

    <?php
    function test(A $a = null, $b) {} // まだ許可されています
    function test(?A $a, $b) {}       // 推奨される書き方
    ?>

  • exclude_disabled を明示的に false に指定して get_defined_functions 関数を呼び出すことは推奨されなくなり、 結果として何も起きなくなりました。 get_defined_functions 関数は無効な関数を返さなくなっています。

Enchant

  • enchant_broker_set_dict_pathenchant_broker_get_dict_path 関数は推奨されません。 これらの機能は libenchant < 1.5 や libenchant-2 では既に利用できないからです。

  • enchant_dict_add_to_personal は推奨されません。 enchant_dict_add を代わりに使って下さい。

  • enchant_dict_is_in_session は推奨されません。 enchant_dict_is_added を代わりに使って下さい。

  • enchant_broker_freeenchant_broker_free_dict は推奨されません。 代わりにオブジェクトを unset して下さい。

  • 定数 ENCHANT_MYSPELLENCHANT_ISPELL は推奨されません。

LibXML

libxml_disable_entity_loader 関数は推奨されなくなりました。 libxml 2.9.0 がビルドに必須になったので、 外部エンティティの読み込みはデフォルトで無効になっていることが保証されています。 よって、(未だ脆弱な) LIBXML_NOENT を使わない限り、 XXE 攻撃を防ぐためにこの関数を使う必要は既になくなっています。 LIBXML_NOENT をまだ使っている場合は、 外部エンティティの読み込みを抑制するように、 libxml_set_external_entity_loader を使ってコードをリファクタリングすることを推奨します。

PGSQL / PDO PGSQL

  • 定数 PGSQL_LIBPQ_VERSION_STR の値は、 PGSQL_LIBPQ_VERSION と同じになりました。 よって、PGSQL_LIBPQ_VERSION_STR は推奨されません。

  • pgsql 拡張モジュールの関数エイリアスは推奨されなくなりました。 代わりにどの関数を使うべきなのかは、以下の一覧を参照ください:

    • pg_errormessagepg_last_error
    • pg_numrowspg_num_rows
    • pg_numfieldspg_num_fields
    • pg_cmdtuplespg_affected_rows
    • pg_fieldnamepg_field_name
    • pg_fieldsizepg_field_size
    • pg_fieldtypepg_field_type
    • pg_fieldnumpg_field_num
    • pg_resultpg_fetch_result
    • pg_fieldprtlenpg_field_prtlen
    • pg_fieldisnullpg_field_is_null
    • pg_freeresultpg_free_result
    • pg_getlastoidpg_last_oid
    • pg_locreatepg_lo_create
    • pg_lounlinkpg_lo_unlink
    • pg_loopenpg_lo_open
    • pg_loclosepg_lo_close
    • pg_loreadpg_lo_read
    • pg_lowritepg_lo_write
    • pg_loreadallpg_lo_read_all
    • pg_loimportpg_lo_import
    • pg_loexportpg_lo_export
    • pg_setclientencodingpg_set_client_encoding
    • pg_clientencoding -> pg_client_encoding

標準ライブラリ

  • true または false を返すソートの比較関数は、推奨されない警告を発生させるようになりました。 0より大きいか、0に等しいか、0より小さい整数を返す実装に置き換えるべきです。

    <?php
    // この実装を
    usort($array, fn($a, $b) => $a > $b);
    // 以下のように置き換えて下さい
    usort($array, fn($a, $b) => $a <=> $b);
    ?>

Zip

  • 空のファイルを ZipArchive として使うことは推奨されなくなりました。 Libzip 1.6.0 は空のファイルを正しいzipアーカイブとして受け入れなくなっています。 既に存在する回避策は、次のバージョンで削除される予定です。

  • Zip の手続き型の API は推奨されなくなりました。 ZipArchive クラスを代わりに使って下さい。 ZipArchive::statIndexfor ループを以下のようにして使えば、 全てのエントリを処理できます:

    <?php
    // 手続き型のAPIを使ってループする
    assert(is_resource($zip));
    while ($entry = zip_read($zip)) {
        echo zip_entry_name($entry);
    }
    
    // オブジェクト指向のAPIを使ってループする
    assert($zip instanceof ZipArchive);
    for ($i = 0; $entry = $zip->statIndex($i); $i++) {
        echo $entry['name'];
    }
    ?>

リフレクション

  • ReflectionFunction::isDisabled は推奨されなくなりました。 無効な関数に対して ReflectionFunction を生成することはできなくなっているためです。 このメソッドは常に false を返すようになっています。

  • ReflectionParameter::getClass, ReflectionParameter::isArray, ReflectionParameter::isCallable は推奨されません。 ReflectionParameter::getTypeReflectionType API を代わりに使って下さい。