
PHP 8 - Quoi de neuf ?
La sortie de PHP 8 fait le tour du web depuis un certain temps déjà, et bien qu'il reste encore presque deux mois, nous savons déjà ce qui est nouveau et lesquelles des modifications peuvent rendre difficile le passage de PHP 7 à la version la plus récente.
Récemment, la dernière des quatre versions bêta prévues a été publiée – cela signifie que jusqu'à la date de sortie prévue le 26 novembre 2020, nous avons encore droit à quatre versions candidates à la publication.
Dans notre agence, où nous fournissons quotidiennement des services Drupal, ainsi que le soutien Drupal, et dans notre équipe où nous avons de nombreux développeurs PHP, nous observons de près toutes les nouvelles et par conséquent, dans le texte ci-dessous, nous présentons les changements les plus importants qui seront introduits par la version 8.
Types d'union
C'est un clin d'œil au typage statique tout en maintenant la nature dynamique du langage. L'Union permet de définir un ensemble de types (deux ou plus), tant pour les données entrantes que sortantes. Jusqu'à présent, la syntaxe du langage ne permettait pas l'utilisation de l'Union, et ce problème a été contourné en définissant des types dans les annotations.
class Example {
private int|string $id;
public function setId(int|string $id): void {
$this->id = $id;
}
public function getId(): int|string {
return $this->id;
}
}
Définir un type void parmi les types retournés est inacceptable car ce type spécifie déjà que la fonction ne renvoie aucune valeur. Cependant, nous pouvons facilement définir null pour désigner les valeurs dites nullables.
Arguments nommés
C'est un problème que de nombreux programmeurs PHP ont rencontré dans leur travail de développement, qui ont souvent dû utiliser des méthodes ou fonctions comportant de nombreux arguments optionnels, dont beaucoup ont des valeurs par défaut. Jusqu'à maintenant, ils n'avaient pas d'autre choix que de copier toutes les valeurs par défaut précédentes d'une fonction dans le même ordre pour attribuer leur propre valeur à l'un des arguments. Les arguments nommés permettent de passer un paramètre basé sur son nom, au lieu de l'ordre.
foo(string $b, ?string $a, ?string $r): {
}
Example::foo(
b: 'Foo',
r: 'Bar',
);
Promotion des propriétés du constructeur
Si l'attribution de plusieurs arguments dans le constructeur aux propriétés de l'objet a perturbé votre sommeil, vous pouvez être rassuré – avec PHP 8, cela n'arrivera plus jamais. Bien que cela soit à peine plus qu'un sucre syntaxique, cette fonctionnalité augmentera certainement la clarté de nombreuses classes dans votre application. Voici une comparaison des constructeurs en PHP 7 et PHP 8.
// PHP 7
class Example {
public Foo $foo;
protected Bar $bar;
public function __construct(
Foo $foo,
Bar $bar
) {
$this->foo = $foo;
$this->bar = $bar;
}
}
// PHP 8
class Example {
public function __construct(
public Foo $foo,
protected Bar $bar,
) {}
}
Attributs
Certains les connaissent sous le nom d'annotations, qui jusqu'à présent étaient créées uniquement sous forme de commentaires (lus par des bibliothèques dédiées telles que Doctrine ORM) — enfin, elles ont été promues en tant que partie réelle et officielle du langage. Après une bataille acharnée sur la façon dont les annotations devaient être marquées, deux signes supérieur à ont été choisis comme ouverture, avec des signes inférieur à pour fermer l'attribut.
use Php\Attributes\Deprecated;
<<Deprecated("Utiliser bar() à la place")>>
function foo() {}
Expression de correspondance
Bien que le nom de cette nouvelle fonctionnalité puisse sembler suggérer un certain lien avec les expressions régulières, elle est plutôt proche de la commande switch. Grâce à ce mécanisme, les développeurs pourront renvoyer la valeur basée sur le paramètre d'entrée, sans utiliser de mots-clés supplémentaires, c'est-à-dire break, return. De plus, Match utilise une typage fort pour comparer les valeurs (similaire à l'utilisation de l'expression de comparaison ===), et si aucun des cas n'est rencontré, l'exception UnhandeledMatchError est lancée par défaut.
$controller = match ($status_code) {
200 => new PageController(),
301, 302, 303 => new RedirectController(),
404 => new PageNotFoundController(),
};
JIT (Just in time compiler)
Le mécanisme, qui était disponible pour des tests depuis PHP 7.4, a finalement eu sa sortie officielle. JIT n'est rien d'autre que la compilation en code machine juste avant son exécution. En pratique, cela vous permet d'exécuter le code d'application "à la volée", plus rapidement qu'avec un interpréteur traditionnel. Cela peut être comparé à la mise en cache de code qui a déjà été interprété.
Pour ceux qui connaissent Hack et HHVM (HipHop Virtual Machine) créés par les développeurs de facebook.com, JIT n'a rien de très surprenant. Dans le monde PHP, avant la sortie de PHP 8, les développeurs ont continué à tenter d'améliorer les performances par tous les moyens disponibles sans utiliser JIT. L'absence de réels domaines d'amélioration les a contraints à suivre les pas de nos collègues de Facebook.
Pour en savoir plus sur JIT, consultez mon article sur JIT dans PHP.
Autres nouvelles fonctionnalités
Parmi les nouveautés que PHP 8 nous offrira, nous trouverons quelques fonctionnalités mineures supplémentaires qui peuvent également être intéressantes pour les nouvelles entreprises - PHP est considéré comme la solution parfaite pour les startups.
- opérateur nullsafe - équivalent de l'opérateur null coalescent pour les méthodes, par exemple $item->getField()?->getValue();
- static - ajouté comme type de valeur retournée, auparavant seul self était disponible;
- mixed - un nouveau type de valeur, ce qui signifie la même chose que la valeur mixed connue dans les commentaires, c'est-à-dire tout type simple;
- WeakMaps - un mécanisme pour stocker des références, qui permet en même temps leur suppression par le ramasse-miettes;
- utilisation de la méthode magique ::class sur les objets – permet d'obtenir la même valeur que celle renvoyée par la fonction get_class();
- virgule finale dans la liste des paramètres de fonction;
- gestion des exceptions sans qu'il soit nécessaire de les assigner à une variable;
- nouvelle interface Stringable - automatiquement assignée à toutes les classes qui implémentent la méthode __toString();
- validation des méthodes abstraites dérivées des traits.
Nouvelles fonctionnalités
En plus des modifications dans la syntaxe du langage mentionnées jusqu'à présent, la sortie de PHP 8 ajoute un certain nombre de nouvelles fonctionnalités utiles, qui, pour être honnête, constituent principalement ce qu'on appelle du sucre syntaxique, mais en même temps, elles augmentent considérablement le confort du travail quotidien avec le langage. Les plus importantes sont :
str_contains()
Parce que tout le monde devait vérifier si une chaîne donnée contenait une sous-phrase définie en utilisant la fonction strpos et vérifier si la valeur retournée était différente de FALSE. La fonction str_contains peut effectuer cette vérification en arrière-plan.
str_starts_with() et str_ends_with()
Les deux fonctions font exactement ce que leur nom indique – elles vérifient si une chaîne commence ou se termine par une certaine valeur.
get_debug_type()
Cette fonction étend la fonction gettype() – sauf qu'elle renvoie le type exact tel que défini dans le code, par exemple, int au lieu de integer, float au lieu de double, ou \Foo\Bar au lieu de object.
Modifications générales
Étant donné qu'il s'agit d'une nouvelle version principale, elle va également introduire quelques changements aux éléments existants du langage. Dans PHP 8, nous pouvons voir un pas clair vers une clarification et une transparence totales, afin qu'ils soient plus prévisibles et n'entraînent pas de confusion inutile.
Les changements importants incluent le retour des exceptions TypeError et ValueError pour les fonctions intégrées. Les mécanismes utilisés pour comparer des variables de différents types, l'ordre de concaténation ou la vérification des types pour les opérations arithmétiques et binaires ont été améliorés. La capacité d'appeler statiquement des méthodes qui ne sont pas statiques a été supprimée.
De plus, des fonctions telles que create_function() and each() ont été supprimées, tandis que les mécanismes d'autres fonctions, y compris array_key_exists() and define() ont été modifiés.
Des changements importants ont également été apportés aux mécanismes par défaut pour la gestion et l'affichage des erreurs. La valeur par défaut pour la signalisation des erreurs sera E_ALL, et l'opérateur @ ne masquera plus les erreurs critiques.
Conclusions
La nouvelle version de PHP 8 est un pas assuré vers une mise en ordre du langage et une version qui apporte de nombreuses fonctionnalités attendues depuis longtemps.
Dans cet article, j'ai résumé les principaux changements et ce que nous pouvons attendre et ce qui peut être important dans le contexte de la mise en œuvre des services de développement PHP. Cependant, j'aimerais vraiment mettre plus de lumière sur le compilateur JIT, qui est présenté sur notre blog dans un article séparé.