T: / Articles techniques / 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 :
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)
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.";
// }
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];
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) {
// ...
}
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']);
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 ?
Attention, malheureusement, la décrémentation, ne fonctionne pas…
$b = 'b';
$b--;
// $b ne contient pas du tout "a"...
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é.
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.
On peut avoir besoin de créer une chaine aléatoire pour plein de raisons :
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 ?
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.)
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 ?
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 :
La liste complète dans la documentation officielle.
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
Comme dit au début de l’article, on va essayer de le compléter au fil du temps, n’hésite pas à repasser 😉
Other content to discover