PHP ne craint plus, examinons les changements de langage intervenus depuis la sortie de PHP 5.4, par Víctor Falcón Ruíz

Je suis fatigué de lire toujours le même message : « PHP, c'est nul ». Mais la plupart de ces critiques n'ont pas regardé PHP depuis 2012, et beaucoup de choses ont changé depuis.


Jetons un coup d'œil aux changements de langage qui ont eu lieu depuis la sortie de PHP 5.4.

Traits (PHP 5.4)

PHP 5.4 a introduit les traits, qui permettent la composition plutôt que l'héritage. Vous pouvez avoir des traits et les inclure dans chaque classe.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
trait SayWorld {
    public function sayHello() {
        echo 'World!';
    }
}
 
class MyHelloWorld {
    use SayWorld;
}

Syntaxe de tableau courte

L'époque où l'on écrivait array() comme un homme des cavernes est révolue. Vous pouvez désormais utiliser les crochets pour une syntaxe de tableau courte.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
$newArray = [
  'first',
  'second',
  'third'
];

Destructuration de tableau

L'affectation d'un tableau à une variable temporaire appartient au passé. Vous pouvez désormais utiliser la déstructuration de tableau pour affecter directement des variables à partir d'un tableau.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
$newArray = [
  'first',
  'second',
  'third'
];
 
$anotherArray = [
  ...$newArray,
  'fourd',
  'fifth'
];

Fonctions variadiques de première classe

Vous pouvez passer autant d'arguments que vous le souhaitez à une fonction en utilisant la syntaxe ....

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
class Variadic {
  public function query($query, ...$attributes) {
    var_dump($query, $attributes);
  }
}
 
$v = new Variadic();
 
$v->query('select * from users', 1, 'Víctor');
 
// result 'select * from users', 1, 'Víctor'

Générateurs

Vous avez besoin de faire quelque chose qui demande beaucoup de mémoire de manière efficace ? Les générateurs sont la solution. Vous trouverez ici plus d'informations sur les générateurs.

Classes anonymes

Vous avez besoin d'une nouvelle classe, mais vous n'avez pas le temps de créer un nouveau fichier ? Les classes anonymes sont la solution. Elles peuvent implémenter une interface comme n'importe quelle autre classe.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
$anonymousClass = new class{
  public $property = 1;
 
  public function add(int $x): int
  {
    return $this->property + $x;
  }
}
 
echo $anonymousClass->propert; // 1
echo $anonymousClass->add(2);  // 3

Virgules flottantes (PHP 7)

Plus besoin de se préoccuper de l'ajout d'une virgule finale à un appel de fonction ou de méthode.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
class TrailingComma {
  public function action(
    int $x,
    int $y, // <- This comma causes an error before
  ) {
    echo $x + $y;
  }
}

Fonctions fléchées

PHP dispose également de fonctions fléchées. Elles ne sont pas exactement comme celles de JavaScript, mais elles sont un excellent ajout au langage.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
$y = 1;
 
$fn1 = fn($x) => $x + $y;
 
$x = $fn1(2); // 3

Opérateur de coalescence Null (PHP 7)

Plus besoin de vérifier la présence de null avant d'assigner une valeur. L'opérateur null coalescent vous couvre.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
// If user is null or undefined, 'nobody' is assigned
$username = $_GET['user'] ?? 'nobody';

Assignation avec l'opérateur de coalescence Null (PHP 7.4)

Et si vous avez besoin de raccourcir l'opérateur de coalescence null, il y a un opérateur d'assignation pour cela aussi.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
// Value of $_GET['user'] change if is undefined or null
$_GET['user'] ??= 'nobody';

Opérateur de chaînage Null (PHP 8)

Plus besoin de vérifier la présence de null avant d'appeler une méthode. L'opérateur de chaînage null est là pour sauver la situation.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
class Customer {
    public function getAddress(): ?Address {}
}
 
class Address {
    public function getCountry(): string {}
}
 
// Null if no Address
$country = $customer->getAddress()?->getCountry();

Arguments nommés (PHP 8)

Vous en avez marre d'utiliser null pour ignorer les arguments optionnels ? Les arguments nommés sont la solution.

Imaginez que vous avez une fonction avec beaucoup d'arguments, dont certains sont nullables.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
function takes_many_args(
    $first_arg,
    $second_arg = 'any',
    $third_arg = 5,
)
{
    // ...
}

Avant vous devez envoyer le $second_arg par défaut, même si vous ne le changez pas.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
takes_many_args('first', 'any', 3);

Maintenant, vous pouvez simplement faire quelque chose comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
takes_many_args('first', third_arg: 3);

Instruction match (PHP 8)

Fini les instructions switch qui font des kilomètres de long. L'instruction match est une façon plus compacte et plus lisible d'écrire les instructions switch.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
$food = 'cake';
 
$return_value = match ($food) {
  'apple' => 'This food is an apple',
  'bar' => 'This food is a bar',
  'cake' => 'This food is a cake',
  default => 'Unknown food',
};
 
var_dump($return_value); // 'This food is a cake'

Enums (PHP 8.1)

Les enums sont enfin là ! Vous pouvez créer des classes enum avec des valeurs et des méthodes, et même les utiliser comme indices de type.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}
 
function do_stuff(Suit $s)
{
    // ...
}
 
do_stuff(Suit::Spades);

Sûreté des types

PHP a maintenant des arguments typés, des types de retour, des types d'union, des types d'intersection, et plus encore. Vous pouvez même utiliser des indices de type pour les enums !

Nous pouvons maintenant ajouter des types aux arguments, aux valeurs de retour, aux propriétés des classes, aux constantes, et à presque tout.

Nom : screenshot-2024-05-09-20.54.40.png
Affichages : 16881
Taille : 62,8 Ko

Promotion des propriétés du constructeur (PHP 8.0)

Le temps des constructeurs verbeux est révolu. La promotion des propriétés du constructeur est là pour réduire le code de la chaudière.

C'est l'un des meilleurs ajouts à PHP, maintenant les classes sont super simples et nous n'avons pas besoin d'écrire les propriétés de classe plus d'une fois.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class Customer
{
    public function __construct(
        public string $name, 
        public string $email, 
    ) {}
}

Propriétés ReadOnly (PHP 8.1)

Maintenant, nous n'avons plus besoin de créer des getters et setters personnalisés et de définir une visibilité privée pour chaque méthode.

Avec le flag readonly, nous pouvons protéger nos propriétés des modifications en dehors de la classe elle-même.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class Customer
{
    public function __construct(
        readonly public string $name, 
        readonly public string $email, 
    ) {}
}

En PHP 8.3, les classes anonymes readonly (en lecture seule) ont été ajoutées.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
$class = new readonly class {
    public function __construct(
        public string $name = 'Víctor',
    ) {}
};

Performance

Les performances de PHP ont augmenté de 400 % entre la version 5.6 et la version 7, et de 20 % entre la version 7 et la version 8.

Il est suffisamment rapide pour la plupart des cas d'utilisation, et si vous avez besoin d'un cas d'utilisation spécialisé, utilisez un langage spécialisé.

Conclusion

En conclusion, PHP n'est pas mort, et il n'est plus nul. Le langage a subi des changements significatifs depuis 2012, et il est grand temps de réviser nos opinions à son sujet.

Avec l'introduction des traits, de la syntaxe de tableau courte, de la déstructuration de tableau, et d'une foule d'autres fonctionnalités, PHP est devenu un langage plus efficace, plus lisible, et plus facile à maintenir.

Ajoutez à cela les améliorations dans la gestion des erreurs, l'introduction des attributs et l'arrivée tant attendue des enums, et il est clair que PHP est devenu un choix robuste et fiable pour le développement web.

Ainsi, la prochaine fois que quelqu'un vous dira que PHP est nul, vous pourrez lui répondre en toute confiance qu'il est resté dans le passé.

Source : "PHP Doesn't Suck Anymore" (par Víctor Falcón Ruíz)

Et vous ?

Quel est votre avis sur le sujet ?
Partagez-vous l'avis selon lequel PHP serait nul ? Selon vous, pourquoi le langage souffre-t-il d'une telle réputation auprès de certains utilisateurs ?

Voir aussi :

PHP 8.2 est disponible et s'accompagne des propriétés "en lecture seule" aux classes, ainsi que la possibilité de déprécier les propriétés dynamiques

PHP 8.3, mise à jour majeure du langage PHP, est disponible, parmi les nouvelles fonctionnalités : le typage explicite des constantes de classe, le clonage profond des propriétés en lecture seule