## 推奨されなくなる機能

### 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_path() と enchant_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_free() と enchant_broker_free_dict() は推奨されません。 代わりにオブジェクトを unset して下さい。

- 定数 `ENCHANT_MYSPELL` と `ENCHANT_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_errormessage() → pg_last_error()
  - pg_numrows() → pg_num_rows()
  - pg_numfields() → pg_num_fields()
  - pg_cmdtuples() → pg_affected_rows()
  - pg_fieldname() → pg_field_name()
  - pg_fieldsize() → pg_field_size()
  - pg_fieldtype() → pg_field_type()
  - pg_fieldnum() → pg_field_num()
  - pg_result() → pg_fetch_result()
  - pg_fieldprtlen() → pg_field_prtlen()
  - pg_fieldisnull() → pg_field_is_null()
  - pg_freeresult() → pg_free_result()
  - pg_getlastoid() → pg_last_oid()
  - pg_locreate() → pg_lo_create()
  - pg_lounlink() → pg_lo_unlink()
  - pg_loopen() → pg_lo_open()
  - pg_loclose() → pg_lo_close()
  - pg_loread() → pg_lo_read()
  - pg_lowrite() → pg_lo_write()
  - pg_loreadall() → pg_lo_read_all()
  - pg_loimport() → pg_lo_import()
  - pg_loexport() → pg_lo_export()
  - pg_setclientencoding() → pg_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::statIndex() と for ループを以下のようにして使えば、 全てのエントリを処理できます:

      <?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::getType() と ReflectionType API を代わりに使って下さい。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open