PHP 8.3 : Les nouvelles fonctionnalités

💡 Depuis ses débuts modestes dans les années 1990, PHP a constamment évolué pour rester pertinent et répondre aux besoins changeants des développeurs. Les versions récentes, notamment PHP 7 et 8, ont introduit des améliorations significatives en termes de performances et de fonctionnalités, assurant la vitalité continue du langage. L'arrivée de PHP 8.3 souligne cet engagement en offrant des mises à jour régulières, garantissant que PHP reste un choix dynamique et à jour pour le développement web contemporain.

Ce jeudi 23 novembre 2023 est sortie la toute dernière version de PHP. La version 8.3 vient alors nous apporter quelques nouveautés, comme à chaque nouvelle version. Même si il ne s’agit que d’une mise à jour “mineure”, les MAJ majeures étant repérées par le premier chiffre de la dite version (passage de la 7.4 à la 8.0 par exemple), quelques changements plus ou moins marquants ont fait leur apparition.

Les principales évolutions

Les propriétés en lecture seule améliorées

Dans cette version, les propriétés en lecture seule reçoivent une mise à jour majeure. Désormais, la possibilité de les réinitialiser lors de la duplication d’objets est ajoutée. L’objectif est d’offrir alors une flexibilité supplémentaire dans la manipulation des données.

readonly class Article {
    public function __construct(
        public DateTime $createdAt,
    ) {}

    // Réinitialise la propriété en lecture seule lors de la duplication
    public function __clone() {
        $this->createdAt = new DateTime();
    }
}

Constantes de classe typées

La déclaration de constantes de classe est désormais assortie d’un type, ce qui améliorera la clarté du code et renforcera la sécurité de vos données.

class Foo {
    const string BAR = 'bar';
}

Nouvel attribut #[Override]

Introduisant l’attribut #[Override], PHP 8.3 offre un moyen explicite de signaler qu’une méthode dans une classe enfant remplace une méthode de la classe parente. Cela renforce la lisibilité du code et assure une meilleure gestion des héritages.

abstract class Category {
    public function methodWithDefaultImplementation(): int {
        return 1;
    }
}

final class Product extends Category {
     // Ci-dessous l'attribut #[Override]
    #[Override]
    public function methodWithDefaultImplementation(): int {
        return 2;
    }
}
💡 Grâce à #[Override], PHP sait désormais que quelque chose ne va pas, grâce à cet attribut. Il dit essentiellement "Je sais que cette méthode doit remplacer une méthode parent. Si cela devait changer, faites-le-moi savoir".

Indices négatifs dans les tableaux

L’utilisation d’indices négatifs dans les tableaux voit une modification intéressante. Désormais, lors de l’ajout d’un nouvel élément à un tableau vide avec un indice négatif, il ne sera plus positionné à l’indice 0, mais plutôt à l’indice spécifié, même s’il est négatif. Prenons l’exemple ci-dessous pour illustrer cette évolution significative :

$array = [];

$array[-7] = 'c';
$array[] = 'z';

var_export($array);
// Avant PHP 8.3 : array (-7 => 'c', 0 => 'z')
// Depuis PHP 8.3 : array (-7 => 'c', -6 => 'z')

La nouvelle et génialissime fonction json_validate()

Une nouvelle fonction, json_validate(), voit le jour dans PHP 8.3, marquant une avancée significative. Cette fonction simplifie la validation d’une chaîne JSON sans nécessiter son décodage complet, offrant ainsi une approche plus efficace et économique pour assurer la validité des données JSON.

json_validate(string $jsonData, int $depth = 512, int $flags = 0): bool

Ajouts au randomizer

La classe Randomizer, introduite dans PHP 8.2, continue son évolution dans la version 8.3 en recevant quelques ajouts judicieux.

Ces améliorations enrichissent davantage les fonctionnalités de génération de nombres aléatoires. Cela offre ainsi aux développeurs un ensemble plus robuste d’outils pour manipuler aléatoirement des données dans leurs applications.

Randomizer::getFloat(
    float $min,
    float $max,
    IntervalBoundary $boundary = IntervalBoundary::ClosedOpen
): float

Randomizer::nextFloat(): float {}

// Exemple
$randomizer = new \\Random\\Randomizer();
echo $randomizer->getFloat(1,16); // Nous sort un float au hasard entre 1 et 16

Les autres changements notables

Les classes anonymes en lecture seule

L’évolution de PHP 8.3 permet la déclaration de classes anonymes en lecture seule, ouvrant ainsi la voie à une nouvelle option pour la gestion des données immuables. Ceci renforce la robustesse et la sécurité des applications.

$myClass = new readonly class {
    public function __construct(
        public string $myVar = 'hello',
    ) {}
};

La récupération dynamique des constantes de classe

La version 8.3 de PHP ouvre désormais la possibilité de récupérer de manière plus dynamique les constantes de classe. Cette évolution offre ainsi une flexibilité accrue dans le processus de développement.

Cette avancée permet aux développeurs d’adopter des approches plus dynamiques et adaptables lors de l’utilisation et de la gestion des constantes au sein de leurs applications.

class Car {
    const BRAND = 'Ford';
}

$name = 'BRAND';

// Ci-dessous : La récupération dynamique en action
Foo::{$name};

Améliorations de la gestion des erreurs unserialize()

La fonction unserialize() émettra désormais toujours un avertissement (E_WARNING) en cas de problème, assurant une gestion plus stricte des erreurs.

Changements à la fonction range()

Dorénavant, la fonction unserialize() émet systématiquement un avertissement (E_WARNING) en cas de problème, et renforce ainsi la gestion des erreurs de manière plus stricte.

Cette modification assure une meilleure visibilité des problèmes potentiels lors de la désérialisation des données, permettant aux développeurs de réagir de manière proactive pour garantir l’intégrité et la sécurité de leurs applications PHP.

Traits et propriétés statiques

Désormais, l’utilisation de traits avec des propriétés statiques entraine la re-déclaration de ces propriétés, et instaure ainsi un espace de stockage distinct pour chaque classe. Cette nouveauté offre une séparation claire des propriétés statiques entre les classes qui utilisent un trait donné, et renforce la modularité et la cohérence dans la gestion des propriétés statiques au sein de l’écosystème PHP.

Détection de débordement de pile

L’introduction de deux nouvelles directives INI, zend.max_allowed_stack_size et zend.reserved_stack_size, permet une meilleure détection des débordements de pile.

zend.max_allowed_stack_size=128K

Nouvelle fonction mb_str_pad()

Dans sa version 8.3, PHP propose une nouvelle fonction : mb_str_pad(). Il s’agit d’une version multioctet de la fonction str_pad(), spécialement conçue pour traiter des chaînes de caractères encodées sur plusieurs octets.

Cela vise à améliorer la manipulation des données dans des contextes linguistiques variés, renforçant ainsi la polyvalence et la compatibilité internationale des applications PHP.

function mb_str_pad(
    string $string,
    int $length,
    string $pad_string = " ",
    int $pad_type = STR_PAD_RIGHT,
    ?string $encoding = null,
): string {}

Closures pour les méthodes magiques et arguments nommés

PHP 8.3 autorise désormais la création de fermetures (closures) à partir de méthodes magiques, et permet ainsi l’utilisation d’arguments nommés.

class myClass {

    public function __call($name, $args) {
        var_dump($name, $args);
    }

   public static function __callStatic($name, $args) {
        var_dump($name, $args);
    }

}
$test = new Test();

// Crée une closure à partir de la méthode magique __call
$closure = $test->magic(...);

// Appelle la closure avec des arguments nommés
$closure(a: 'hello', b: 'world');

Visibilité constante non variante

Auparavant, la visibilité des constantes n’était pas vérifiée lors de l’implémentation d’une interface. PHP 8.3 corrige ce bogue, mais cela pourrait entraîner des interruptions de code dans certaines situations si vous n’étiez pas conscient de ce comportement.

Cette correction renforce la cohérence dans la manière dont les constantes sont héritées à partir d’interfaces, garantissant ainsi une conformité plus stricte aux règles de visibilité définies dans le langage PHP.

interface I {
    public const HELLO = 'hello';
}

class C implements I {
    private const HELLO = 'hello';
}

Les dépréciations à noter

Les dépréciations RFC

Comme c’est la norme à chaque nouvelle version, une RFC spécifique introduit diverses petites dépréciations. Soulignons que les dépréciations ne constituent pas des erreurs et contribuent généralement à l’évolution du langage.

Voici quelques-unes des dépréciations qui ont été validées, témoignant de l’engagement continu de la communauté PHP envers l’amélioration constante du langage.

  1. Dépréciation du passage d’une largeur négative à mb_strimwidth()
    • Cette dépréciation concerne l’utilisation de largeurs négatives avec la fonction mb_strimwidth(). Les développeurs sont encouragés à ajuster leur code pour se conformer à cette modification future.
  2. Dépréciation et suppression de la constante NumberFormatter::TYPE_CURRENCY
    • La constante NumberFormatter::TYPE_CURRENCY est dépréciée et sera éventuellement supprimée. Les utilisateurs sont incités à mettre à jour leur code pour utiliser les alternatives recommandées.
  3. Dépréciation et suppression de l’implémentation Mt19937 pré-PHP 7.1 (MT_RAND_PHP)
    • L’implémentation Mt19937 pré-PHP 7.1 (MT_RAND_PHP) est désormais dépréciée et sera retirée. Les développeurs sont invités à migrer vers des approches plus récentes et conformes aux normes actuelles.
  4. Dépréciation et suppression de l’appel à ldap_connect() avec 2 paramètres $host et $port
    • L’appel à ldap_connect() avec deux paramètres, $host et $port, est désormais déprécié. Pour assurer une meilleure clarté et éviter les erreurs potentielles, les développeurs sont encouragés à utiliser les options de configuration explicites.
  5. Dépréciation des restes de codes évalués en chaîne de caractères
    • La pratique d’évaluer du code en tant que chaîne de caractères est dépréciée. Cette approche, bien que toujours fonctionnelle, est désormais considérée comme obsolète, et les développeurs sont incités à adopter des méthodes plus modernes et sécurisées.

Les exceptions Date/Heure plus appropriées

En effet, notons un effort significatif pour améliorer la gestion des erreurs liées aux dates et heures en introduisant des exceptions dédiées. Cette initiative vise à offrir une expérience de développement plus précise et conviviale, en fournissant des exceptions spécifiques qui facilitent le diagnostic. Rendant un peu plus agréable la résolution des problèmes liés à la manipulation des dates et heures dans les applications PHP.

En conclusion

Petite vidéo de rattrapage d’un stream de plusieurs contributeurs PHP célébrant PHP8.3 en direct sur Youtube

Ces améliorations et modifications apportées à PHP 8.3 illustrent l’engagement continu de la communauté PHP à améliorer et à faire évoluer le langage. Tout cela visant à offrir aux développeurs de nouvelles fonctionnalités et des améliorations de performances.

Aussi, vous souhaitez rester informés des dernières actualités ? Alors n’hésitez pas à vous abonner à la newsletter, me suivre sur Twitter ou vous abonner au site TontonFranck. La mise à jour vers PHP 8.3 promet une expérience de développement PHP plus riche et plus puissante que jamais.

Le gros dictionnaire :