PHP tips pas banales


Cet article est une traduction a posteriori d'un billet d'abord publié en anglais, parfois des mois en arrière, mais que je tiens à traduire.

Voici quelques conseils PHP pas banals à mon avis.

Permalien pour la section Guillemets simples ou doubles ? Guillemets simples ou doubles ?

Franchement de la micro-optimisation si on considère les dernières versions de PHP (7++). A moins d’avoir à évaluer des millions de lignes ou traiter des centaines de milliers de requêtes par seconde, il n’y aura pas de différence notable de performance.

Les doubles guillemets permettent l’interpolation des variables contrairement aux guillemets simples:

$var = "echo";
echo 'simple string {$var}' . PHP_EOL;// simple string {$var}
echo "advanced string with my variable: {$var} \n";// advanced string with my variable: echo

Choisissez un style et gardez le même partout dans le code. Alternativement, vous pouvez utiliser la syntaxe nowdoc ou la syntaxe heredoc qui peut gérer de multiples lignes à la fois.

Je ne recommande pas de penser en termes de performance ici. La maintenance sera plus impactante pour moi :

  • Le format est-il lisible ?
  • Est-ce que c’est plus agréable à taper au clavier ?

Permalien pour la section isset() n’est pas !empty() ou is_null() isset() n’est pas !empty() ou is_null()

Une erreur ultra-classique mais assez peu expliquée :

$p = "";
if (!empty($p)) { // does not work here
    echo 'is not empty';
}
if (isset($p)) {
    echo 'is set and is not null.';
}
if (!is_null($p)) {
    echo 'is not null.';
}

$p est vide mais pas null or isset() ne fait que vérifier si c’est null ou pas. Cela devient encore plus compliqué si null est une valeur possible de $p.

is_null() c’est l’opposé de isset(), mais cela ne s’applique qu’aux variables existantes et ne doit donc pas être utilisé pour vérifier cette existence.

Permalien pour la section isset() ou array_key_exists()? isset() ou array_key_exists()?

Prenons un tableau PHP basique :

$myArray = [
    "response" => "ok",
    "some_key",
];

var_dump(isset($myArray["some_key"]), array_key_exists("some_key", $myArray);// false false

Chaque fonction retourne false mais c’est peut-être pas ce à quoi vous vous attendiez. Ajoutons une valeur pour comprendre d’où peut venir la confusion :

$myArray = [
    "response" => "ok",
    "some_key" => null,
];

var_dump(isset($myArray["some_key"]), array_key_exists("some_key", $myArray);// false true

Le problème est que some_key n’est pas uné clé mais une valeur pour la clé “0” du tableau :

$myArray = [
    "response" => "ok",
    "some_key",
];

var_dump(array_keys($myArray)); // response, 0
var_dump(array_values($myArray));// ok, some_key

isset() fait à peu près le même job que array_key_exists() ici, mais il vérifie, en plus, que la variable est non nulle.

Si cette vérification n’est pas nécessaire, alors il convient d’utiliser plutôt array_key_exists().

N’ajoutez pas ce genre de code à rallonge pour autant :

$myArray = [
    "response" => "ok",
    "some_key" => null,
];
if (in_array("some_key", array_keys($myArray))) {
    // some code
}

Utilisez plutôt isset() car c’est beaucoup plus rapide en termes de traitement. Les devs PHP qui souhaitent tirer le meilleur parti des deux approches peuvent utiliser l’astuce suivante :

if (isset($myArray['some_key']) || array_key_exists('some_key', $myArray)) { 
    // some code
}

Le moteur PHP va évaluer la partie droite de la condition seulement si $myArray['some_key'] est nul. Si la clé existe mais sa valeur est null alors il fera un travail plus important avec array_key_exists('some_key', $myArray).

Permalien pour la section Les astuces PHP sur Google sont dépréciées Les astuces PHP sur Google sont dépréciées

Précisez bien la version de PHP dans vos termes de recherche sinon vous allez souvent obtenir des astuces conçues pour des versions très anciennes du langage.

Le web est plein de tutos à base de regex pour valider les inputs emails alors que filter_var semble mieux indiqué :

// since PHP 5.2
print_r(filter_var($email, FILTER_VALIDATE_EMAIL) !== false);

Source: PHP documentation - filter_var()

Permalien pour la section Nullable n’est pas null Nullable n’est pas null

Avec PHP, vous pouvez écrire :

// since PHP 7.1
function greet(?string $message)
{
    print_r($message);
}

Il s’agit des nullable types et c’est très utile mais pas du tout pour sauter un paramètre :

greet();// fatal error

Cela veut juste dire que $message peut être null. Pour avoir une valeur par défaut, il faut la spécifier :

function greet(string $message = "Hello")
{
    print_r($message);
}
greet();// Hello

Permalien pour la section Conclusion Conclusion

PHP peut-être piégeux. Gardez l’oeil ouvert, toujours.

Cette page est aussi disponible dans d'autres langues :