Bien que la nouvelle version de PHP soit mineure, elle apporte déjà de nombreuses fonctionnalités nouvelles, sans exagération, à la fois pour la syntaxe du langage et ses performances. La liste des innovations n'est pas définitive, mais les principales modifications ont déjà été apportées et acceptées. La sortie est prévue pour décembre 2019.

Changements clés pour la prochaine version:
- Propriétés de classe typées
- Précharge pour de meilleures performances
- Fonctions fléchées pour l'écriture courte de fonctions anonymes
- Affectation d'un opérateur d'union avec null (?? =)
- Covariance / contravariance dans les signatures de méthode héritées
- Une interface de fonction externe qui ouvre de nouvelles possibilités pour développer des extensions en PHP
- Opérateur de déballage en tableaux
En savoir plus sur ces changements et d'autres sous le chat.
Avertissement: Plusieurs fois dans mes discussions avec des collègues, nous avons présenté l'article de Brent « Nouveau en PHP 7.4 ». Au début, je voulais faire une traduction, mais dans le processus, j'ai réalisé que toutes les dernières mises à jour ne sont pas indiquées dans le texte et qu'il y a des inexactitudes, donc cet article est apparu à la place de la traduction.Fonctions fléchées ( RFC )
Les fonctions fléchées vous permettent de faire un enregistrement plus court des fonctions anonymes:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)
Quelques caractéristiques de l'implémentation adoptée des fonctions fléchées:
- Ils peuvent accéder à la portée
parent
, il n'est donc pas nécessaire d'utiliser le mot clé use. $this
également disponible, comme dans les fonctions anonymes régulières.- Les fonctions fléchées ne peuvent contenir qu'une seule ligne, qui est également un opérateur de retour.
Vous pouvez en savoir plus à leur sujet dans cet
article sur Habr.
Propriétés typées ( RFC )
Hourra! Les propriétés de classe peuvent désormais avoir un indice de type. Il s'agit d'un changement très attendu depuis PHP 7 vers un typage plus fort du langage. Nous avons maintenant toutes les fonctionnalités de base pour une frappe forte. Tous les types sont disponibles pour la frappe, sauf
void
et
callable.
class Bar { public string $name; public ?int $amount; public Foo $foo; }
Si vous voulez que j'examine plus en détail les nouvelles possibilités de taper les propriétés des objets, notez-les dans les commentaires et j'écrirai un article séparé à leur sujet!
Attribuer un opérateur de jointure nul ( RFC )
Au lieu d'une si longue entrée:
$data['date'] = $data['date'] ?? new DateTime();
Maintenant, il sera possible d'écrire comme ceci:
$data['date'] ??= new DateTime();
Opérateur de déballage de baie ( RFC )
Vous pouvez maintenant utiliser l'opérateur de décompression dans les tableaux:
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; <i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Veuillez noter que cela ne fonctionne qu'avec des tableaux non associatifs.
Interface de fonction externe ( RFC )
L'interface de fonction externe (FFI) vous permet d'écrire du code C directement en code PHP. Cela signifie que les extensions PHP peuvent être écrites en PHP pur.
Il convient de noter qu'il s'agit d'un sujet complexe. Vous avez encore besoin de connaître C pour utiliser correctement ces fonctionnalités.
Précharge ( RFC )
Le préchargement est un ajout formidable au noyau PHP, ce qui devrait entraîner des améliorations significatives des performances.
Par exemple, si vous utilisez le framework, ses fichiers doivent être téléchargés et recompilés pour chaque requête. Lorsque vous utilisez opcache - la première fois que ces fichiers sont impliqués dans le traitement d'une demande, puis chaque fois qu'ils sont vérifiés avec succès pour les modifications. Le préchargement permet au serveur de charger les fichiers PHP spécifiés en mémoire au démarrage et de les avoir constamment disponibles pour toutes les demandes suivantes, sans vérification supplémentaire des modifications de fichiers.
L'amélioration des performances n'est «pas gratuite» - si les fichiers préchargés sont modifiés, le serveur doit être redémarré.
Covariance / contravariance dans les signatures de méthodes héritées ( RFC )
Actuellement, PHP a principalement des types de paramètres invariants et des types de retour invariants. Cette modification vous permet de remplacer le type du paramètre par l'un de ses supertypes. À son tour, le type retourné peut être remplacé par son sous-type. Ainsi, ce changement permettra de suivre plus strictement le principe de substitution Barbara Liskov.
Un exemple d'utilisation d'un type de retour covariant:
interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; }
et argument contravariant:
interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { function concat(iterable $input) {/* . . . */} }
Sérialisation d'objets personnalisés ( RFC )
Deux nouvelles méthodes magiques deviennent disponibles:
__serialize
et
__unserialize
. Ce mécanisme de sérialisation combine la polyvalence de l'interface
Serializable
avec l'approche de mise en œuvre des méthodes de
__sleep/__wakeup
. Plus de détails sur leurs différences peuvent être trouvés dans le RFC.
Priorité de concaténation ( RFC )
Si vous avez écrit quelque chose comme ça:
echo "sum: " . $a + $b;
PHP interpréterait maintenant ceci comme:
echo ("sum: " . $a) + $b;
PHP 8 interprétera cela différemment:
echo "sum :" . ($a + $b);
PHP 7.4 ajoute un avertissement d'obsolescence lorsqu'il détecte une expression contenant "." avant le "+" ou le "-" et non entouré de crochets.
__toString
charge des exceptions __toString
( RFC )
Auparavant, les exceptions ne pouvaient pas être levées à partir de la
__toString
magique
__toString
. La raison de ce comportement est que la conversion d'objets en chaînes est effectuée dans de nombreuses fonctions de la bibliothèque standard et que tous ne sont pas prêts à "traiter" correctement les exceptions. Dans le cadre de cette RFC, un audit complet des conversions de chaînes dans la base de code a été effectué, et cette restriction peut maintenant être supprimée, ce qui a été fait.
Réflexion de lien ( RFC )
Les bibliothèques, telles que
symfony/var-dumper
, s'appuient fortement sur
ReflectionAPI
pour afficher avec précision les variables. Auparavant, il n'y avait pas de support approprié pour la réflexion des liens, ce qui obligeait ces bibliothèques à s'appuyer sur des hacks pour détecter les liens. PHP 7.4 ajoute une classe
ReflectionReference
qui résout ce problème.
Ajout de la mb_str_split
( RFC )
Cette fonction fournit les mêmes fonctionnalités que
str_split
, mais pour les chaînes écrites dans des codages multi-octets.
Extension ext-hash
toujours disponible ( RFC )
Cette extension est désormais disponible en permanence dans toutes les installations PHP.
PEAR n'est pas activé par défaut ( EXTERNALS )
PEAR n'est plus activement pris en charge, l'équipe principale a décidé de le supprimer de l'installation par défaut avec PHP 7.4.
Registre d'algorithmes de hachage de mot de passe ( RFC )
Une nouvelle fonction
password_algos
a été ajoutée, qui renvoie une liste de tous les algorithmes de hachage de mot de passe enregistrés.
Liens faibles ( RFC )
Les liens faibles vous permettent d'enregistrer un lien vers un objet qui n'empêche pas la destruction de cet objet. Par exemple, ils sont utiles pour implémenter des structures de type cache.
Délimiteur littéral numérique ( RFC )
L'absence de séparateurs visuels dans les groupes de chiffres augmentait le temps de lecture et de débogage du code et pouvait entraîner des erreurs involontaires. Ajout de la prise en charge du caractère de soulignement dans les littéraux numériques pour séparer visuellement les groupes de nombres.
1_000_000_000 // int 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary 0137_041; // octal
Balises ouvertes courtes déconseillées ( RFC )
Balise d'ouverture courte
<?
est obsolète et sera supprimé en PHP 8. La balise courte
<?= (echo)
pas
<?= (echo)
affectée.
Opérateur ternaire associatif gauche décliné obsolète ( RFC )
L'opérateur ternaire a des bizarreries étranges en PHP. Ce RFC déprécie les opérateurs ternaires imbriqués.
1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok
En PHP 8, un tel enregistrement entraînera une erreur au niveau de la compilation.
Voici quelques-unes des modifications les plus importantes incompatibles en amont:
- Un appel à
parent::
dans une classe sans parent est obsolète. - L'appel de
var_dump
sur une instance de DateTime
ou DateTimeImmutable
ne rend plus les propriétés d'objet disponibles. openssl_random_pseudo_bytes
une exception dans les situations d'erreur causées par la bibliothèque OpenSSL. Auparavant, elle renvoyait false, ce qui pouvait conduire à la génération d'une chaîne vide.- Tenter de sérialiser un
PDO
ou une instance d'un PDOStatement
lève une Exception
au lieu d'une PDOException
. - L'appel de
get_object_vars()
sur une instance d' ArrayObject
renverra les propriétés de l' ArrayObject
lui-même, pas la valeur du tableau ArrayObject
. Pour obtenir des valeurs de tableau ArrayObject
comme précédemment, ArrayObject
en type de array
.