Modifications entrainant une incompatibilité ascendante

PHP Core

Accès de type tableau des non-tableaux

Essayer d'utiliser des valeurs de type null, bool, int, float ou ressource comme un tableau (comme $null["clé"]) va maintenant générer un avis.

Fonction get_declared_classes()

La fonction get_declared_classes() ne renvoie plus les classes anonymes qui n'ont pas encore été instanciées.

mot-clé fn

fn est maintenant un mot-clé réservé. En particulier, il ne peut plus être utilisé comme une fonction ou un nom de classe. Il peut encore être utilisé comme une méthode ou un nom de constante de classe.

<?php tag à la fin du fichier

<?php à la fin du fichier (sans nouvelle ligne) sera désormais interprété comme une balise PHP d'ouverture. Auparavant, il était interprété soit comme une balise courte d'ouverture suivie d'une php littérale et aboutissait à une erreur de syntaxe (avec short_open_tag=1) ou était interprété comme une chaîne <?php (avec short_open_tag=0).

Filtres de flux

Lors de l'utilisation de include/require sur un flux, streamWrapper::stream_set_option() sera invoqué avec l'option STREAM_OPTION_READ_BUFFER. Les implémentations de filtre de flux personnalisés peuvent avoir besoin d'implémenter la méthode streamWrapper::stream_set_option() pour éviter un avertissement (toujours retouner false est une implémentation suffisante).

Sérialisation

Le format o de sérialisation a été supprimé. Comme il n'est jamais produit par PHP, cela peut seulement briser la désérialisation des chaînes construites manuellement.

Constantes d'algorithme de mot de passe

Les identificateurs d'algorithme de hachage de mot de passe sont maintenant des chaînes nullables plutôt que des entiers.

  • PASSWORD_DEFAULT était l'entier 1 ; maintenant c'est la chaîne '2y' (en PHP 7.4.0, 7.4.1, et 7.4.2 c'était null)
  • PASSWORD_BCRYPT était l'entier 1; maintenant est '2y'
  • PASSWORD_ARGON2I était l'entier 2; maintenant est 'argon2i'
  • PASSWORD_ARGON2ID était l'entier 3; maintenant est 'argon2id'

Les applications utilisant correctement les constantes PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I, et PASSWORD_ARGON2ID continueront à fonctionner correctement.

Fonction htmlentities()

htmlentities() va maintenant lever un avis (au lieu d'un avertissement de normes strictes) s'il est utilisé avec un codage pour lequel seule la substitution d'entité de base est supportée, auquel cas il est équivalent à htmlspecialchars().

Les fonctions fread() et fwrite()

fread() et fwrite() vont maintenant retourner false si l'opération échoue. Auparavant, une chaîne vide ou 0 était retourné(e). EAGAIN/EWOULDBLOCK ne sont pas considérés comme des échecs.

Ces fonctions soulèvent également un avis sur l'échec, par exemple lorsque vous essayez d'écrire à une ressource de fichier en lecture uniquement.

BCMath Arbitrary Precision Mathematics

Les fonctions BCMath avertiront désormais si un nombre non bien formé est adopté, tel que "32foo". L'argument sera interprété comme zéro, comme avant.

CURL

Tenter de sérialiser une classe CURLFile va maintenant générer une exception. Auparavant, l'exception n'était lancée que sur la désérialisation.

L'utilisation de CURLPIPE-HTTP1 est dépréciée et n'est plus prise en charge à partir de cURL 7.62.0.

Le paramètre $version de curl_version () est déprécié. Si une valeur n'est pas égale à la valeur par défaut CURLVERSION_NOW est passé, un avertissement est levé et le paramètre est ignoré.

Date et heure

Appeler var_dump() ou similaire sur une instance DateTime ou DateTimeImmutable ne laissera plus de propriétés accessibles sur l'objet.

La comparaison des objets DateInterval (à l'aide de ==, <, etc.) va maintenant générer un avertissement et toujours retourner false. Auparavant, tous les objets DateInterval étaient considérés comme égaux, à moins qu'ils n'aient des propriétés.

Intl

La valeur par défaut du paramètre de idn_to_ascii() et idn_to_utf8() est maintenant INTL_IDNA_VARIANT_UTS46 au lieu de la valeur déconseillée INTL_IDNA_VARIANT_2003.

MySQLi

La fonctionnalité du serveur intégré a été supprimée. Elle a été cassée depuis au moins PHP 7.0.

La propriété non documentée mysqli::$stat a été supprimée au profit de mysqli::stat().

OpenSSL

La fonction openssl_random_pseudo_bytes() lance une exception dans les situations d'erreur, semblable à random_bytes(). En particulier, une Error est lancée si le nombre d'octets demandés est inférieur ou égal à zéro, et une Exception est lancée si un caractère aléatoire suffisant ne peut pas être recueilli. L'argument de sortie $crypto_strong est garanti d'être toujours true si la fonction ne lance pas d'exception, afin de vérifier explicitement qu'il n'est pas nécessaire.

Expressions régulières (compatible Perl)

Lorsque le mode PREG_UNMATCHED_AS_NULL est utilisé, les groupes de capture non trouvés seront désormais également réglés à null (ou [null, -1] si la capture offset est activée). Cela signifie que la taille de $matches sera toujours la même.

PHP Data Objects

Une tentative de sérialisation d'une instance de PDO ou PDOStatement va désormais générer une Exception plutôt qu'une PDOException, compatible avec d'autres classes internes qui ne prennent pas en charge la sérialisation.

Reflection

Les objets Reflection génèrent désormais une exception si une tentative est faite pour les sérialiser. La sérialisation des objets Reflection n'a jamais été prise en charge et a donné lieu à des objets Reflection corrompus. Il a été explicitement interdit maintenant.

La valeur des constantes de classe de ReflectionClassConstant, ReflectionMethod et ReflectionProperty ont été changé.

Bibliothèque PHP standard (SPL)

L'appel get_object_vars() sur une instance ArrayObject retournera toujours les propriétés de l'ArrayObject lui-même (ou d'une sous-classe). Auparavant, il retournait les valeurs du tableau/objet à moins que le drapeau ArrayObject::STD_PROP_LIST n'ait été spécifié.

Les autres opérations touchées sont les suivantes :

  • ReflectionObject::getProperties()
  • reset(), current(), etc. Utiliser plutôt les méthodes d'Iterator.
  • Potentiellement d'autres fonctions travaillant sur les propriétés de l'objet comme une liste, e.g. array_walk().

Les modifications de type (array) ne sont pas affectées. Elles continueront à retourner soit le tableau enveloppé, soit les propriétés ArrayObject, selon que le drapeau ArrayObject::STD_PROP_LIST est utilisé.

SplPriorityQueue::setExtractFlags() lancera une exception si zéro est passé. Auparavant, cela générerait une erreur fatale récupérable lors de la prochaine opération d'extraction.

ArrayObject, ArrayIterator, SplDoublyLinkedList et SplObjectStorage gèrent maintenant __serialize() et __unserialize() en plus de l'interface Serializable. Cela signifie que les charges utiles de sérialisation créées sur les anciennes versions PHP peuvent toujours être désérialisées, mais les nouvelles charges utiles créées par PHP 7.4 ne seront pas compatibles par les anciennes versions.

Tokenizer

token_get_all() émettra maintenant un jeton T-BAD-CHARACTER pour les caractères inattendus au lieu de laisser derrière eux des trous dans le flux de jetons.

Cookies entrants

Depuis PHP 7.4.11, les noms des cookies entrants ne sont plus url-décodés pour des raisons de sécurité.

add a note add a note

User Contributed Notes 1 note

up
20
happydog at kennel17
3 years ago
Re: "The o serialization format has been removed. As it is never produced by PHP, this may only break unserialization of manually crafted strings."

This little-o serialisation format was used by PHP3 but was never generated by PH PHP4 or above.  The deserialization code still recognised it, though, for reasons of backwards-compatibility with PHP3.

However, based on a bit of investigation, it looks like this code has been broken for about 15 years, so although this is listed as a deprecation, in practice it wasn't.

See this Stack Overflow question for a really great answer, with a lot more detail about this: https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for
To Top