Aller au contenu principal

Améliorer la syntaxe PHP

Écrire un code plus propre et lisible grâce aux fonctionnalités modernes de PHP 8

Notions théoriques

Les versions récentes de PHP (depuis PHP 7 et surtout PHP 8) ont introduit de nombreuses fonctionnalités permettant d'écrire un code plus concis, plus lisible et plus expressif.

Opérateur de coalescence nulle (??)

L'opérateur ?? retourne la valeur de gauche si elle existe et n'est pas null, sinon il retourne la valeur de droite. Il remplace avantageusement isset() et les ternaires verbeux.

// Avant
$name = isset($player) ? $player->getName() : 'Inconnu';

// Après
$name = $player?->getName() ?? 'Inconnu';

Expression match

match est une alternative à switch, plus stricte (comparaison identique ===) et qui retourne une valeur directement, sans break.

// Avant
switch ($level) {
case 1: $label = 'Débutant'; break;
case 2: $label = 'Intermédiaire'; break;
default: $label = 'Expert';
}

// Après
$label = match($level) {
1 => 'Débutant',
2 => 'Intermédiaire',
default => 'Expert',
};

Arguments nommés (PHP 8)

Les arguments nommés permettent de passer des arguments dans n'importe quel ordre en utilisant leur nom, améliorant la lisibilité des appels de fonctions avec plusieurs paramètres.

// Avant
array_slice($characters, 0, 5, true);

// Après
array_slice(array: $characters, offset: 0, length: 5, preserve_keys: true);

Promotion de propriété dans le constructeur (PHP 8)

Combine déclaration de propriété et paramètre de constructeur en une seule ligne, éliminant le code répétitif.

// Avant
class Player {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
}

// Après
class Player {
public function __construct(private string $name) {}
}

Enums (PHP 8.1)

Les enums définissent un ensemble fini de valeurs nommées, idéal pour représenter des états ou des catégories. Ils remplacent les constantes de classe éparpillées.

enum CharacterClass: string
{
case Warrior = 'warrior';
case Mage = 'mage';
case Rogue = 'rogue';
}

Exemple de mise en application

Dans notre jeu, la méthode qui détermine le libellé du niveau d'un personnage peut être réécrite avec les nouvelles syntaxes :

// Version ancienne
function getLevelLabel(int $level): string
{
switch ($level) {
case 1:
return 'Novice';
case 2:
return 'Apprenti';
case 3:
return 'Héros';
default:
return 'Légende';
}
}

// Version moderne avec match
function getLevelLabel(int $level): string
{
return match($level) {
1 => 'Novice',
2 => 'Apprenti',
3 => 'Héros',
default => 'Légende',
};
}

Test de mémorisation/compréhension


Que retourne `$player?->getName() ?? "Inconnu"` si `$player` vaut `null` ?


Quelle est la différence principale entre `match` et `switch` ?


Qu'est-ce que la promotion de propriété dans le constructeur ?


Depuis quelle version de PHP les Enums sont-ils disponibles ?


À quoi servent les arguments nommés en PHP 8 ?



TP pour réfléchir et résoudre des problèmes

Modernisez le code de votre jeu en appliquant les nouvelles syntaxes PHP 8

Étape 1 : Remplacez le switch de la méthode getClassLabel par une expression match.

Étape 2 : Utilisez l'opérateur ?? pour retourner le nom du personnage ou 'Sans nom' si la propriété est null.

Étape 3 : Créez un enum CharacterClass avec les valeurs Warrior, Mage et Rogue.


Bonne pratique - Adopter les syntaxes modernes progressivement

Les nouvelles syntaxes PHP 8 (match, ??, promotion de propriété, enums) rendent le code plus lisible et moins sujet aux erreurs. Adoptez-les progressivement : commencez par remplacer les switch par match et les ternaires isset() par ??. Un outil comme PHP CS Fixer peut signaler automatiquement les endroits où ces améliorations sont applicables.

Une solution