Trucs et astuces en PHP

Une dizaine de trucs et astuces en PHP, le 5ème va vous étonner !

Petit florilège de trucs et astuces avec PHP ! Des fonctionnalités du langage qu’on retrouve rarement dans les tutoriels classiques et qui ont parfois leur utilité quand on code. Cet article évoluera au cours du temps, on viendra rajouter des sections au fur et à mesure de nos découvertes et expérimentations !

Sommaire :

Multi attribution de variables en PHP

On peut définir une seule valeur pour plusieurs variables de cette façon :

$variable1 = $variable2 = $variable3 = "Même valeur";

Par exemple, quand je cherche à me connecter à la base de données de Tainix, le username et le nom de la base sont identiques, je fais directement :

$database = $username = 'tainix35';
$password = 'g234ier765iuerX';

Héhé t’as cru que c’était les vrais identifiants ?!

Lorsqu’on utilise une fonction qui retourne en tableau, cela peut permettre de créer plusieurs variables d’un coup. Par exemple quand on utilise un explode :

$codeCarteBancaireTainix = '2853 2397 1349 1234';
[$partie1, $partie2, $partie3, $partie4] = explode(' ', $codeCarteBancaireTainix);
// $partie1 contient '2853'
// $partie2 contient '2397'
// etc.

Heureusement que je te donne pas le code de sécurité, sinon tu irais faire des achats 😉 (778)

Multi attribution de variables dans un foreach en PHP

Prenons un tableau de tableaux, arrêtons avec la CB de Tainix, et partons sur des recettes de cuisine :

$recettes = [
    ['Pâtes au Pesto', 'Basilic', '20min'],
    ['Pâtes à la Bolognaise', 'Tomates', '30min'],
    ['Pâtes à la Carbonara', 'Parmesan', '25min'],
];

Ce code est tout à fait fonctionnel et permet de créer 3 variables à chaque itération :

foreach ($recettes as [$nom, $ingredientSecret, $duree]) {
    echo "Pour faire des $nom, il faut l'ingrédient secret : $ingredientSecret. Cela te prendra $duree.";
}


// Au lieu de faire :
// foreach ($recettes as $recette) {
//     $nom = $recette[0];
//     $ingredientSecret = $recette[1];
//     $duree = $recette[2];
    
//     echo "Pour faire des $nom, il faut l'ingrédient secret : $ingredientSecret. Cela te prendra $duree.";
// }

Permutation des valeurs en PHP

Tu te souviens du tout premier exercice d’algorithmique ? Echanger la valeur de 2 variables ?

L’occasion de créer une troisième variable pour mémoriser une valeur avant qu’elle ne soit écrasée :

$var1 = 'A';
$var2 = 'B';

// Nouvelle variable
$var3 = $var1;
$var1 = $var2;
$var2 = $var3;

Et bien, ça peut se faire en 1 ligne :

[$var2, $var1] = [$var1, $var2];

Le contrôle avant un foreach en PHP

Un foreach sert à parcourir un tableau. On voit parfois dans du code la vérification que ce tableau n’est pas vide avant de réaliser le foreach :

if (! empty($tableau)) {
   foreach ($tableau as $valeur) {
      // ...
   }
}

Ca ne sert à rien ! Le code suivant ne crée aucune erreur, et ne pose aucun problème de performance :

$tableau = [];

foreach ($tableau as $valeur) {
   // ...
}

Le contrôle avant un unset en PHP

Un peu comme le point précédent, la fonction unset permet de détruire une variable ou l’élément d’un tableau. Et il n’est pas nécessaire de vérifier que la variable existe ou que la clé du tableau existe :

if (isset($varQuiExistePeutEtre)) {
   unset($varQuiExistePeutEtre);
}

$tableau = ['cle' => 1];

if (array_key_exists('autre_cle', $tableau)) {
   unset($tableau['autre_cle']);
}

Encore une fois, ça ne sert à rien ! Le code suivant ne crée aucune erreur, et ne pose aucun problème de performance :

unset($varQuiExistePeutEtre);

$tableau = ['cle' => 1];

unset($tableau['autre_cle']);

Incrémenter des lettres en PHP

Quoi ? Mais l’incrémentation c’est pour les nombres !

Et bien en PHP, on peut faire ça :

$var = 'a';
$var++;

echo $var; // Affiche "b"

// Autres exemples : 
// 'z' => 'aa'
// 'aab' => 'aac'
// 'bonjour' => 'bonjous'
// 'A' => 'B'

Ok c’est rigolo, mais à quoi ça sert ?

  • Générer des séquences de chaines de caractères, c’est à dire des chaines de caractères qui se suivent et qui se ressemblent.
  • Initialiser un tableau, si on souhaite avoir des index sous forme de lettre(s)
  • Itérer sur les lettres de l’alphabet, par exemple pour créer un menu, une pagination par lettre
  • Coder un programme Brute Force en PHP 😉

Utiliser array_column sur un objet en PHP

array_colum est une fonction qui permet de récupérer les valeurs d’une colonne d’un tableau multidimensionnel. Exemple :

$devs = [
   ['prenom' => 'Marie', 'langage' => 'PHP'],
   ['prenom' => 'John', 'langage' => 'Javascript'],
   ['prenom' => 'Said', 'langage' => 'Python']
];

$langages = array_column($devs, 'langage');
// ['PHP', 'Javascript', 'Python']

Maintenant si chaque dev est l’instance d’une classe Dev et qu’on souhaite récupérer les langages, et bien array_column continue de fonctionner !

class Dev
{
   public function __construct(
      public string $prenom,
      public string $langage
   ) {}
}

$devs = [
   new Dev('Marie', 'PHP'),
   new Dev('John', 'Javascript'),
   new Dev('Said', 'Python'),
];

$langages = array_column($devs, 'langage');
// ['PHP', 'Javascript', 'Python']

Il suffit de passer en argument le nom de la propriété.

Récupérer le premier (ou le dernier) élément d’un tableau en PHP

Si on travaille avec un tableau auto indexé, c’est facile, le premier élément se trouve à l’index 0 et on le récupère de cette façon :

$premierElement = $tableau[0];

Mais s’il s’agit d’un tableau associatif, ou si des index sont manquants (et donc potentiellement l’index 0), on ne sait plus quel est le premier index. Prenons un tableau avec un seul élément et imaginons qu’on ne connaisse pas la clé :

$tableau = ['name' => 'PHP'];

// $premierElement = $tableau[0]; // Warning: Undefined array key 0

$premierElement = $tableau[array_key_first($tableau)]; // Ok !

La méthode array_key_first retourne la première clé du tableau et on peut donc retrouver la valeur correspondante. Fonctionne à l’autre bout du tableau de la même façon avec array_key_last.

Générer rapidement une chaine de caractères aléatoires en PHP

On peut avoir besoin de créer une chaine aléatoire pour plein de raisons :

  • Génération d’un token
  • Génération d’un mot de passe temporaire
  • Génération d’une clé de sécurité
  • Génération d’un hash

Si on peut s’amuser à parcourir aléatoirement un alphabet ou autre combinaison de caractères, on peut aussi utiliser cette syntaxe.

// Clé aléatoire de 50 caractères
$token = bin2hex(random_bytes(25));

Comment ça fonctionne ?

  • random_bytes retourne une chaine de caractères aléatoires composées de caractères spéciaux.
  • bin2hex transforme ces caractères spéciaux en valeur hexadécimale, qui seront alors tous écrits sur 2 caractères.
  • Donc pour une clé de 50 caractères, il faut passer 25 en argument (50 / 2)

Attention, même si une fonction aléatoire est utilisée, dans ton code, il peut être important de contrôler l’unicité du résultat obtenu. Si par exemple les tokens sont enregistrés en base de données pour des opérations uniques (récupération de mot de passe, identifiant d’un contenu, etc.)

Convertir rapidement le format d’une date en PHP

Normalement, si on utilise la classe Datetime ou une librairie comme Carbon, on n’a pas besoin de cette astuce. Mais dans de vieilles codebase, cela peut être utile (c’est dans les vieilles marmites qu’on fait les meilleurs algos TMTC).

$date = '2023-06-02';

// Comment la passer facilement en '02/06/2023' ?
// Avec des substr et de la concaténation ?

// Plutot avec strtotime :
$date = date('d/m/Y', strtotime($date));

Comment ça fonctionne ?

  • La fonction date accepte un second paramètre, à savoir un timestamp
  • La fonction strtotime tranforme une date en timestamp. Il n’y a pas de format spécifique à respecter, strtotime peut effectuer des parsing assez complexes.
  • La fonction date, à partir d’un timestamp peut retourner n’importe quel format de date, selon le premier argument

Utiliser les constantes magiques prédéfinies en PHP

PHP propose des constantes « magiques » prédéfinies. « magiques » parce qu’elles vont retourner une valeur spécifique à leur contexte d’utilisation.

Ce sont des constantes qu’on retrouve souvent quand on se plonge dans les codebase des frameworks par exemple pour pouvoir effectuer des traitements de façon dynamique.

Quelques exemples :

  • __DIR__ : le dossier du fichier executé
  • __FUNCTION__ : le nom de la fonction courante
  • __CLASS__ : le nom de la classe courante (contient le namespace également)

La liste complète dans la documentation officielle.

Fini les erreurs « end of line » en PHP

Pour les fichiers qui ne contiennent que du PHP (une classe par exemple), il ne faut pas finir le fichier avec ?>. Le risque étant d’inclure une ou plusieurs lignes qui seraient en dehors des balises PHP, ce qui peut engendrer des erreurs. Ces erreurs sont en plus très compliquées à identifier car elles viennent de lignes vides…

Donc :

<?php
// Je commence mon fichier

class MaSuperClasse
{
   // ...
   // ...
}

// Le code est fini, surtout pas de balise PHP fermante

Autres trucs et astuces PHP

A suivre…

Comme dit au début de l’article, on va essayer de le compléter au fil du temps, n’hésite pas à repasser 😉


Qui a codé ce superbe contenu ?

Keep learning

Autres contenus à découvrir


Ta newsletter chaque mois

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