
Combinaison de littéraux de chaîne et de variables en PHP
En PHP, nous avons plusieurs options pour spécifier des chaînes de caractères, mais la plupart d'entre nous ne connaissent que la définition des littéraux de chaîne en utilisant des guillemets. Parfois, ces chaînes sont simples et nous pouvons les utiliser telles quelles, mais le plus souvent, nous devons les rendre dynamiques, combinées avec différentes variables.
Il est important de bien comprendre comment vous pouvez combiner des littéraux de chaîne avec n'importe quelle variable.
Les approches les plus courantes pour adapter une chaîne sont d'utiliser :
- Guillemets simples avec concaténation,
- Guillemets doubles avec variable dans la chaîne,
- Fonction sprintf (vsprintf),
- Syntaxe heredoc (newdoc).
Nous allons nous concentrer sur chaque option, ses points forts et ses points faibles. Premièrement, plongeons dans la théorie.
Théorie
#1 Guillemets simples avec concaténation
Une chaîne entre guillemets simples n'interprète pas les variables qu'elle contient. Contrairement aux autres options, les variables dans une chaîne entre guillemets simples ne seront pas élargies lorsqu'elles se produisent. Cela signifie que vous devez utiliser la concaténation.
'La variable est' . $var;
#2 Guillemets doubles et variable dans la chaîne
Avec les guillemets doubles, le compilateur PHP étendra chaque variable échappée à l'intérieur d'un littéral de chaîne.
"La variable est {$var}";
#3 Fonction Sprintf (vsprintf)
Sprintf est la fonction la plus puissante et avancée pour le formatage des chaînes en PHP, vous offrant de nombreuses options pour contrôler le résultat final. Elle vous permet de formater des chaînes selon un langage de modèle spécial et semble être un moyen beaucoup plus puissant d'insérer des variables en elles, bien qu'avec un coût de temps de traitement plus élevé.
La fonction sprintf prend le modèle de chaîne comme premier argument. Ensuite, il peut y avoir une quantité indéfinie d'arguments. Sprintf remplacera les espaces réservés dans une chaîne selon les arguments que vous avez passés à la fonction.
sprintf('La variable est %s', $var);
#4 Heredoc (et maintenantdoc)
Un Here Document est défini comme une section d'un fichier de code source qui est traité comme si elle était un fichier séparé.
La syntaxe améliorée (depuis PHP 7.3), nous permet d'utiliser heredoc d'une manière plus lisible, beaucoup plus propre et moins sujette aux erreurs. Heredoc vous permet de faire quelque chose de plus difficile à faire avec un littéral de chaîne entre guillemets. Il vous permet de définir un bloc de texte comme littéral.
Par défaut, PHP traitera un heredoc comme il le ferait avec un littéral de chaîne entre guillemets doubles, tandis que nowdoc - une chaîne entre guillemets simples. Pour utiliser un nowdoc, nous devons simplement entourer l'identifiant d'ouverture par des guillemets simples.
Syntaxe Heredoc :
$str = <<<STR
La variable est $var
STR;
Syntaxe Newdoc :
$str = <<<'STR'
La variable est $var
STR;
Pratique
Testons chaque approche avec quelques exemples.
Considérez le texte suivant :
Toc toc, "LANG" te tient. Réveille-toi NAME, ACTION
#1 Concat
$str = 'Toc toc, "' . $lang . '" te tient. Réveille-toi ' . $name . ', ' . $action;
Nous devons gérer un grand nombre de guillemets, de concaténations et d'espaces supplémentaires ici.
#2 Variable dans la chaîne
$str = "Toc toc, \"{$lang}\" te tient. Réveille-toi {$name}, {$action}";
Semble beaucoup mieux, souvenez-vous simplement d'échapper les variables, et les caractères spéciaux (« dans ce cas).
#3 Sprintf
$str = sprintf('Toc toc, "%s" te tient. Réveille-toi %s, %s', $lang, $name, $action);
Semble également assez lisible, sans échappement.
Alternativement, nous pouvons passer les variables sous forme de tableau.
$vars = [
'PHP',
'Développeur',
'temps de coder'
];
$str = sprintf('Toc toc, "%s" te tient. Réveille-toi %s, %s', ...$vars);
Pareil si nous utilisons la fonction vsprintf.
$str = vsprintf('Toc toc, "%s" te tient. Réveille-toi %s, %s', $vars);
#4 Heredoc
$str = <<<STR
Toc toc, "$lang" te tient. Réveille-toi $name, $action
STR;
Aucune échappement, pas de concaténations ou guillemets supplémentaires, pas besoin d'appeler des fonctions, mais 3 lignes pour une simple chaîne.
Disons que nous voulons ajouter un balisage avec des variables dynamiques :
<div class="container">
<p style="font-size:SIZEpx;line-height:SIZEpx;">
<span class="first-item" style="color:red">TEXT1</span>
<span class="last-item" style="color:black">TEXT2/span>
</p>
</div>
Nous recommanderions d'utiliser heredoc ici :
<<<TEXT
<div class="container">
<p style="font-size:{$size}px;line-height:{$size}px;">
<span class="first-item" style="color:red">$text1</span>
<span class="last-item" style="color:black">$text2</span>
</p>
</div>
TEXT;
Variable dans la chaîne semble similaire, mais nous avons besoin d'un peu plus de caractères d'échappement ‘\’ et {}.
"<div class=\"container\">
<p style=\"font-size:{$size}px;line-height:{$size}px;\">
<span class=\"first-item\" style=\"color:red\">{$text1}</span>
<span class=\"last-item\" style=\"color:black\">{$text2}</span>
</p>
</div>";
La concaténation semble moins lisible, mais grâce au formatage, ce n'est pas agaçant. Mais ce n'est pas le principal problème ici :
'<div class="container">
<p style="font-size:' . $size . 'px;line-height:' . $size . 'px;">
<span class="first-item" style="color:red">' . $text1 . '</span>
<span class="last-item" style="color:black">' . $text2 . '</span>
</p></div>';
Imaginez que nous voulons ajouter une nouvelle variable dynamique au tag <p>, en syntaxe heredoc :
display: $display;
ou en double quoted :
display: {$display};
Alors que pour un cas single quoted, nous devons trouver le bon endroit avant d'ajouter plus de concaténations et de guillemets. Il est très facile de faire une erreur :
display:' . $display . ';">' . '
Et qu'en est-il de sprintf :
sprintf('<div class="container">
<p style="font-size:%spx;line-height:%spx;">
<span class="first-item" style="color:red">%s</span>
<span class="last-item" style="color:black">%s</span>
</p>
</div>', $size, $size, $text1, $text2);
Passer une chaîne sur plusieurs lignes ne semble pas génial, à moins que vous ne vouliez l'assigner à une variable d'abord.
Aussi, rappelez-vous de garder le nombre d'espaces réservés pour les variables bas. Sinon, vous aurez un cauchemar de maintenance avec plus de 10 paramètres, en essayant d'ajouter de nouvelles %s, de trouver la position dans la liste des paramètres et de l'ajouter à l'appel sprintf.
Dans l'exemple ci-dessus, si nous voulons ajouter une nouvelle variable
display: %s;
juste après le line-height, nous devons comprendre qu'il s'agit du troisième paramètre et le lister comme argument entre $size et $text1. Cela ne semble pas cool.
Dans ce cas, vous pouvez essayer de jouer avec les espaces réservés ordonnés comme %1$s, %2$s, de plus ces espaces réservés peuvent être répétés sans ajouter plus d'arguments dans le code.
sprintf('<div class="container">
<p style="font-size:%1$spx;line-height:%1$spx;display:%4$s">
<span class="first-item" style="color:red">%2$s</span>
<span class="last-item" style="color:black">%3$s</span>
</p>
</div>', $size, $text1, $text2, $display);
Comparaison des performances
La configuration initiale de notre test :
- PHP 7.3
- Nombre d'itérations - 5.000.000
- Le cas simple est Toc toc, $lang te tient.
- Le cas compliqué est Toc toc, "$lang" te tient. Réveille-toi $name, $action
Les résultats :
Guillemets Simples | Guillemets Doubles | Sprintf | Sprintf (alt) | Heredoc | |
---|---|---|---|---|---|
cas simple, ms | 275 | 259 | 533 | 572 | 260 |
cas compliqué, ms | 685 | 479 | 935 | 888 | 487 |
MYTHE : Utiliser “ est plus rapide que ‘. PHP n'utilisera pas de traitement supplémentaire pour interpréter ce qu'il y a à l'intérieur des guillemets simples, tandis qu'à l'intérieur des guillemets doubles, PHP doit analyser et vérifier s'il y a des variables.
Aujourd'hui, l'argument selon lequel l'un est plus performant que l'autre ne tient plus, sauf si vous commencez à combiner la chaîne avec des variables, alors la méthode des guillemets doubles est définitivement la gagnante ici.
Résumé
Nous trouvons l'option variable dans la chaîne la méthode la plus utilisable pour combiner les chaînes et les variables. Mais le conseil général est d'utiliser chaque méthode pour un scénario donné.
Voici les recommandations pour chaque approche :
- Utilisez les guillemets simples par défaut à moins que vous n'ayez besoin d'utiliser des variables dans la chaîne. Sinon, vous aurez un désordre de maintenance qui augmente avec la complexité des chaînes, car vous devez gérer un grand nombre de guillemets, de concaténations et d'espaces supplémentaires. Il en va de même pour la performance, la chaîne avec plus de concaténations est moins efficace par rapport au #2 et #3.
- Les chaînes double quoted sont plus élégantes car vous n'avez pas à interrompre votre chaîne à chaque fois que vous devez insérer une variable (comme vous devez le faire avec les chaînes single quoted). En conséquence, il est plus facile d'écrire et de lire de telles chaînes. C'est aussi l'une des approches les plus rapides, surtout dans des scénarios difficiles.
- Heredoc agit comme une chaîne double quoted, ce qui pourrait également être l'option pour vous. Les syntaxes heredoc et nowdoc sont très utiles lorsque nous voulons définir une chaîne sur plusieurs lignes. La performance est égale à #2.
- L'option la plus flexible et la plus puissante est sprintf, mais aussi la plus lente. Vous pouvez l'utiliser, mais pour les chaînes plus courtes, car cela devient assez difficile d'utiliser cette solution après 4-5 variables. N'oubliez pas que vous pouvez faire bien plus que simplement insérer des valeurs de variables dans des chaînes, par exemple, spécifier le format des nombres (hex, décimal, octal), le nombre de décimales, le remplissage et bien d'autres.
Chez Droptica, nous fournissons des services de développement PHP depuis plus de 10 ans. Ce texte est le résultat de l'expérience acquise. Donc, si vous avez un projet qui nécessite une expertise PHP, n'hésitez pas à nous contacter.