PHP

Bonnes pratiques PHP #2 typage, protection et comparaison stricte

Le typage en PHP ne doit avoir aucun secret pour toi.

PHP a souvent été décrié pour son manque de typage. Mais depuis PHP 7 (2016) le typage est disponible dans PHP et doit donc être utilisé au maximum.

Typer permet, entre autres, de structurer et renforcer ton code. En effet, si le typage n’est pas respecté, PHP déclenche mécaniquement une erreur fatale. Cela peut permettre aussi d’éviter que PHP ne fasse les conversions de types qui l’arrangent le plus, et qui peuvent produire des comportements inattendus.

Cet article rassemble quelques rappels et bonnes pratiques autour du typage PHP.

Typage en PHP

En PHP, il est possible de typer :

  • Les paramètres d’une fonction ou méthode
  • Le retour d’une fonction ou méthode
  • Les propriétés d’une classe

Exemple :

<?php
function calcul(array $data): int
{
	// Fait des calculs sur les données contenues dans un tableau $data
	// Retourne un entier
}

function testFormat(string $password): bool
{
	// Teste le format de la chaîne de caractères $password
	// Retourne un booléen
}

final class Hero
{
	private int $force;
	// La propriété $force est un entier

	public function __construct(int $startForce = 10)
	{
		$this->force = $startForce;
	}
	// Pas de type de retour pour le constructeur

	public function addForce(int $value): void
	{
		$this->force += $value;
	}
	// "void" permet de préciser que la méthode ne retourne rien
}

Typer te permet de renforcer et sécuriser ton code. En effet, PHP déclenche une erreur fatale si le typage n’est pas respecté. Pour une méthode, plus besoin de tester la nature du ou des paramètres, PHP le fera directement. Si tu structure une fonction avec un type de retour précis attendu, si la fonction évolue et que ce retour vient à changer, pareil, PHP déclenche une erreur fatale.

Ce n’est ici qu’un avant-goût de ce qu’il est possible de faire avec le typage, n’hésite pas à te référer à la documentation officielle pour plus d’informations.

Protection dans les classes

Comme pour le typage, cette bonne pratique te permet de renforcer et sécuriser ton code.

Tu crées une nouvelle classe, déclare-la comme « final ». Tu crées des propriétés ou des méthodes, déclare-les comme « private ».

Et tu ne change que si tu en as besoin, de cette manière, tu as une classe qui est toujours sécurisée.

Pour l’exemple, tu peux te référer à la classe Hero juste au-dessus :

  • Il n’y a (pour le moment) pas de classe qui hérite de Hero, je laisse donc « final »
  • La propriété $force est réservée à la classe, donc elle reste « private »
  • Mon constructeur est « public »
  • Ma méthode « addForce » doit pouvoir être appelée en dehors de ma classe, je l’ai donc passé, après l’avoir déclarée initialement comme « private », en « public »

Comparaison stricte

Les opérateurs de comparaison stricte « === » ou « !== » permettent d’inclure la correspondance du type dans la comparaison. Et donc de comparer des choses semblables, sans se reposer sur la « magie » de PHP.

Exemples :

<?php
$sentence = 'Bryan is in the kitchen';
if (strpos($sentence, 'Bryan') != false) {
	echo 'Bryan is here';
}

// Ce code n'affiche rien

strpos renvoie la position de « Bryan » dans $sentence et va renvoyer false s’il ne trouve pas « Bryan ». Comme « Bryan » est au début, strpos renvoie 0. Et en PHP, 0 et false, dans une opération booléenne, c’est la même chose ! Du coup, il n’y a pas d’affichage. Il faut donc écrire :

$sentence = 'Bryan is in the kitchen';
if (strpos($sentence, 'Bryan') !== false) {
	echo 'Bryan is here';
}

// Ce code affiche bien "Bryan is here"

Avec donc « !== » au lieu de simplement « != ». Ici PHP va faire une comparaison stricte, en impliquant le type. Et du coup 0 n’est plus la même chose que false.

Encore une fois, en utilisant la comparaison stricte 100% du temps, tu renforces et sécurises ton code. Certaines erreurs (comme celle présentée dans l’exemple) sont aussi plus faciles à identifier.

Ne pas se reposer sur la magie de PHP

En complément, quelques exemples à faire attention, pour améliorer la compréhension de son code :

// Dans un if, je teste des booléens
if ($monBooleen) {
    // Aucun soucis ici   
}

// Si j'ai un nombre, un nombre d'occurence par exemple
if ($nbOccurences) {
    // PHP va considérer false si la valeur est 0, true sinon
    // La compréhension n'est pas optimale
}

// Plus précis :
if ($nbOccurences !== 0) {
   // ...
}

// Si j'ai un tableau, un tableau de compétences par exemple
if ($skills) {
    // PHP va considérer false si le tableau est vide, true sinon
    // La compréhension n'est pas optimale
}

// Plus précis :
if (!empty($skills)) {
    // ...
}

// ou encore
if ($skills !== []) {
    // ...
}

Et on continue

Bonnes pratiques PHP #3 construire ses fonctions et méthodes


Qui a codé ce superbe contenu ?


Ta newsletter chaque mois

Corrigés, challenges, actualités, veille technique... aucun spam.