lundi 19 juillet 2010
En ce début de semaine, je vous présente un petit survol sur l'utilisation des variables en PHP à l'attention des débutants. Pour les autres, révision obligatoire pour se rafraîchir la mémoire sur des notions qu'on prend pour acquis.
1. Entre apostrophe
La base, où le texte est entre apostrophes (single quotes).
$var = 'world';2. Concaténation
echo 'Hello $var';
// Erreur. Imprimera le texte en littéral: Hello $var
Pour venir juxtaposer la valeur d'une variable, on peut utiliser la concaténation avec le caractère . (point).
$var = 'world';3. Entre guillemets
echo 'Hello ' . $var;
// Imprimera: Hello World
Pour pouvoir insérer la variable à même la chaîne de caractères, on utilisera les guillemets (double quotes).
$var = 'world';4. Tableau indexé (array)
echo "Hello $var";
// Imprimera: "Hello World"
Lorsque la valeur se trouve dans un tableau, on peut l'imprimer normalement en utilisant l'index indiqué entre crochets.
$arr = array('Gibson', 'Fender', 'Godin');5. Tableau associatif
// imprimera en littéral le texte Guitare $arr[2]
echo 'Guitare $arr[2]';
// imprimera la valeur Godin (excellentes guitares québécoises en passant)
echo "Guitare $arr[2]";
C'est ici que ça se complique un peu. Supposons le tableau suivant :
$arr = array('a' => 'Gibson', 'b' => 'Fender', 'c' => 'Godin');Les deux causent des erreurs. Comment résoudre ce problème ? Avec les accolades :
// on peut ni utiliser cette syntaxe :
echo "Guitare $arr['c']";
// ni celle-ci :
echo "Guitare $arr["c"]";
echo "Guitare {$arr['c']}";Utilisées dans ce contexte, les accolades permettent l'interprétation du code PHP. Autrement dit, on dit à PHP d'évaluer ce qu'il y a à l'intérieur avant de faire le reste.
6. Propriété d'un objet
Si on ne connaît pas le truc des accolades, on peut contourner cette difficulté en attribuant d'abord la valeur à une variable.
$age = $oPerson->getAge();7. Composer le nom de la variable
echo 'Son âge est: ' . $age;
// ou
echo "Son âge est: $age";
// mais comme nous le connaissons :
echo "Son âge est: {$oPerson->getAge()}";
Disons deux variables où les noms possèdent le même préfixe mais qui se terminent par le code de langue (fr ou en). Une troisième variable qui contient la valeur de langue utilisée pourrait permettre de déterminer la variable à afficher.
$default_fr = 'Bonjour';8. Stocker le nom de la variable dans une variable avec $$
$default_en = 'Hello';
$lang = 'fr';
echo ${"default_" . $lang};
// ou
echo ${"default_$lang"};
// Imprimera "Bonjour"
Moins populaire et plus difficile à lire, cette méthode permet de stocker le nom d'une variable dans une variable. Pour faire simple, la valeur de la première variable devient le nom de la variable. Peut-être que l'exemple ci-dessous illustrera mieux ce qui se passe :
$variable = 'code18';Personnellement, je vois mal dans quel contexte je l'utiliserais.
$$variable = "une valeur";
echo $code18;
// Imprimera "une valeur"
Conclusion
J'ai connu certains programmeurs qui ont découvert toute la portée des utilisations possibles et qui se sont mis à en faire un exercice de style dans leurs projets. Ce n'est pas parce que le feature existe qu'il faut nécessairement l'utiliser. Le mot d'ordre : Keep it simple.
Avec la conclusion "Keep it simple" et par souci d'optimisation, il est préférable d'utiliser les single quotes «'» : PHP interprètera le code plus rapidement qu'avec les double-quotes «"»
La différence semble assez minime. Quelque chose manque au test ?
xdebug_enable();
$start = xdebug_time_index();
$var = 'world';
for($i=0 ; $i<10000 ; $i++){
//echo "Hello " . $var;
echo "Hello $var";
}
$end = xdebug_time_index();
echo $end - $start;
/*
0.028982162475586 seconde avec single quote et concaténation de la variable
0.030441045761108 seconde avec double-quote et variable dans la string
*/
parce que sinon le echo ecrase completement les stats
0.001075 simple quote
0.001390 double quote
presque 40% plus lent ! donc a bannir.
de plus il est preferable de faire
echo "blabla",$var
qui va echo les variables les une a la suite des autre plutot que
echo "blabla".$var qui va créer une copie de la variable en memoire puis l'echo.
Je comprends ton point. Cet exemple illustre mieux ce qui se passe sur une boucle de 10000 itérations.
$var = 'world';
# 0.013002157211304
echo "Hello " . $var;
# 0.031078100204468
echo "Hello $var";
# 0.0097420215606689
echo "Hello ", $var;
Par contre, je nuancerais en disant que le single quote est préférable au double toutes les fois que c'est possible plutôt que de le bannir complètement. C'est plus pour une question de bonnes pratiques.