## Fonctionnalités obsolètes

### PHP Core

- Si un paramètre avec une valeur par défaut est suivi d'un paramètre obligatoire, la valeur par défaut n'a pas d'effet. Ceci est obsolète à partir de PHP 8.0.0 et peut généralement être résolu en supprimant la valeur par défaut du paramètre, sans changer la fonctionnalité.

  `<?php
  function test($a = [], $b) {} // Avant
  function test($a, $b) {} // Après
  ?>`

  Une exception à cette règle sont les paramètres de la forme `Type $param = null`, où la valeur par défaut null rend le type implicitement nullable. Cette utilisation reste autorisée, mais il est recommandé d'utiliser un type explicitement nullable :

  `<?php
  function test(A $a = null, $b) {} // Toujours autorisé
  function test(?A $a, $b) {} // Recommandé
  ?>`

- Appeler get_defined_functions() avec `exclude_disabled` explicitement à `false` est obsolète et n'a plus d'effet. get_defined_functions() n'inclura jamais les fonctions désactivées.

### Enchant

- enchant_broker_set_dict_path() et enchant_broker_get_dict_path() sont obsolètes, car cette fonctionnalité n'est pas disponible dans libenchant < 1.5 ni dans libenchant-2.

- enchant_dict_add_to_personal() est obsolète ; utilisez plutôt enchant_dict_add() à la place.

- enchant_dict_is_in_session() est obsolète ; utilisez plutôt enchant_dict_is_added() à la place.

- enchant_broker_free() et enchant_broker_free_dict() sont obsolètes ; détruissez l'objet à la place.

- Les constantes `ENCHANT_MYSPELL` et `ENCHANT_ISPELL` sont obsolètes.

### LibXML

libxml_disable_entity_loader() est maintenant obsolète. Comme libxml 2.9.0 est désormais requis, le chargement d'entités externes est garanti d'être désactivé par défaut, et cette fonction n'est plus nécessaire pour se protéger contre les attaques XXE, à moins d'utiliser la constante (toujours vulnérable) `LIBXML_NOENT`. Dans ce cas, il est recommandé de refactoriser le code en utilisant libxml_set_external_entity_loader() pour supprimer le chargement des entités externes.

### PGSQL / PDO PGSQL

- La constante `PGSQL_LIBPQ_VERSION_STR` a maintenant la même valeur que `PGSQL_LIBPQ_VERSION` et est donc obsolète.

- Les alias de fonctions de l'extension pgsql sont obsolètes. Voir la liste suivante pour savoir quelles fonctions doivent être utilisées à la place :

  - 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()

### Bibliothèque standard

- Les fonctions de comparaison de tri qui retournent `true` ou `false` lèveront désormais un avertissement d'obsolescence, et doivent être remplacées par une implémentation qui retourne un entier inférieur, égal ou supérieur à zéro.

  `<?php
  // Remplacer
  usort($array, fn($a, $b) => $a > $b);
  // Par
  usort($array, fn($a, $b) => $a <=> $b);
  ?>`

### Zip

- L'utilisation d'un fichier vide en tant que ZipArchive est obsolète. Libzip 1.6.0 n'accepte plus les fichiers vides comme des archives zip valides. La solution de contournement existante sera supprimée dans la prochaine version.

- L'API procédurale de Zip est obsolète. Utilisez plutôt ZipArchive. L'itération sur toutes les entrées peut être réalisée en utilisant ZipArchive::statIndex() et une boucle for:

  `<?php
  // itère à l'aide de l'API procédurale
  assert(is_resource($zip));
  while ($entry = zip_read($zip)) {
  echo zip_entry_name($entry);
  }
  // itère à l'aide de l'API orientée objet
  assert($zip instanceof ZipArchive);
  for ($i = 0; $entry = $zip->statIndex($i); $i++) {
  echo $entry['name'];
  }
  ?>`

### Reflection

- ReflectionFunction::isDisabled() est obsolète, car il n'est plus possible de créer un ReflectionFunction pour une fonction désactivée. Cette méthode retourne maintenant toujours `false`.

- ReflectionParameter::getClass(), ReflectionParameter::isArray(), et ReflectionParameter::isCallable() sont obsolètes. Les APIs ReflectionParameter::getType() et ReflectionType doivent être utilisées à la place.