Optimisation PHP : les chaines de caractères
Par J.Ducastel le vendredi 30 novembre 2007, 12:16 - Formules - Lien permanent
Voici une petite astuce concernant les chaînes de caractères pour optimiser
vos scripts PHP, que certains découvriront peut-être. Prenez l'habitude
d'utiliser les apostrophes (simple quotes
)
plutôt que les guillemets (double quotes
). Ceci
parce que les chaines entre guillemets peuvent contenir des variables qui
seront évalués à l'éxécution. Par exemple :
$uper_riche='Picsou';
// ceci affiche : Bonjour, je suis Picsou
echo "Bonjour, je suis $uper_riche";
// alors que ceci affiche : Bonjour, je suis $uper_riche
echo 'Bonjour, je suis $uper_riche';
// on peut utiliser les accolades pour acceder à des noms complexes
$Picsou->neveux=array('Riri','Fifi','Loulou');
// ceci affichera : Le second neveu de Picsou est Fifi, il en a trois
echo "Le second neveu de Picsou est {$Picsou->neveux[1]}, il en a trois";
Ce qui double son travail, car le code est d'abord interprété une première
fois à la lecture du script et découpé en blocs sémantiques (chunks
) : variables, chaines, instructions etc. Une chaine
entre apasotrophes sera alors conservée telle quelle jusqu'à la fin de
l'execution du script, alors qu'une chaine entre guillemets devra être
interprétée à chaque évaluation. Par conséquent, il vaut mieux les éviter
autant que possible. Par exemple :
/**
* on construit une chaine de caracteres dynamiques en separant bien les chunks variables des blocs statiques
*/
$html='<p>Bonjour, je suis '.$uper_riche.'</p>';
/**
* on ne force pas l'evaluation du parametre passe a une fonction
*/
echo 'Qui est le plus riche ? '.strtoupper('picsou !');
/**
* idem pour les clefs d'un tableau associatif
*/
echo $personnages['picsou']['neveux'][1];
C'est le genre de petites choses qui peuvent paraitre évidentes une fois devenues une habitude, mais qui ensuite évitent de plomber vos scripts inutilement.

Commentaires
Salut,
Selon les cas, la différence n'est pas si énorme d'après un benchmark récent [1], il vaut mieux éviter des trucs du type
$ma_chaine = "truc $foo";
qu'il vaut mieux remplacer par
$ma_chaine = "truc ".$foo;
mais
$ma_chaine = 'truc '.$foo;
donne les même performances...
Par contre chose intéressante et moins connue
echo 'truc ', $foo;
est un peu mieux que
echo 'truc ' . $foo;
[1] http://m-fernandez.developpez.com/a...
Effectivement l'utilisation de la virgule est plus rapide que la concaténation lorsque l'on utilise la structure du langage echo(). Echo() est en fait une fonction particulière qui peut prendre une infinité de paramètres (d'où la virgule). Chaque paramètre est affiché directement sur la sortie standard lorsque l'on utilise la virgule alors qu'avec le point de concaténation, l'interprêteur construit toute la chaine avant de l'envoyer comme un unique paramètre à echo() pour l'affichage.
Néanmoins, la différence de performances entre la virgule et le point reste minime mais reste au final une bonne pratique à adopter.
Merci pour les liens et le complément d'infos.