Echo, le point et la virgule

Eléphanteau du PHP | 28 Messages

03 sept. 2005, 12:10

Bonjour,

petite question sans doute bête mais qui mérite (pour moi ;)) un éclaircissement.

Imaginons le script suivant (qui n'a aucune autre utilité que de vous présentez mon interrogation) :
<?php

$i = "bleus";

echo 'Salut les amis ' , isset($i) ? $i : ''; 

?>
affiche :
Salut les amis bleus
Par contre (notez le point à la place de la virugle)
<?php

$i = "bleus";

echo 'Salut les amis ' . isset($i) ? $i : ''; 

?>
affiche
bleus
Qui peut m'expliquer pourquoi (j'ai parcouru la page du manuel sur echo() mais je n'y trouve rien qui puisse me renseigner là-dessus) ?

Merci et bonne journée ;)

Mammouth du PHP | 19672 Messages

03 sept. 2005, 13:25

Le point est en PHP l'opérateur de concaténation. La virgule est un séparateur qui distingue les différents paramètres envoyés dans une fonction.

Donc pour reprendre ton exemple, la bonne formulation est :
<?php

$i = "bleus";

echo 'Salut les amis '. isset($i) ? $i : '';

?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 28 Messages

03 sept. 2005, 13:52

Merci pour ton message, mais j'avoue n'être pas éclairé.

Je précise que mon but est d'obtenir :

"Bonjour les amis bleus" (étrange phrase je le sais, peut-être s'agit-il d'une sorte de réminiscence ayant pour origine les Schtroumpfs ?)

Dans ce que tu nommes la "bonne formulation", nous n'obtenons que :

"bleus"

Et c'est là même l'origine de mon interrogation. Pourquoi le point ne concatène-t-il pas "Salut les amis" et $i, soit "bleus" ?
Pourquoi seul "bleus" est affiché en sortie ?

D'autre part, je sais bien que la virgule permet de séparer les arguments d'une fonction (je ne suis pas débutant au point de l'ignorer ;)) mais est-il juste de dire que c'est son rôle ici alors qu'echo n'est justement pas une fonction ?

Merci ;)

Ajout de dernière minute.

En fait le problème est surtout par rapport à l'opérateur ternaire. En effet :
echo 'Bonjour les amis '. $i;
renvoit bien ce que je cherche à avoir (évidemment !). Mais ce n'est plus le cas avec l'opérateur ternaire, qui semble jouer différemment selon que l'on utilise des virgules ou des points. Et c'est donc là-dessus qu'il me faut en fait un éclaircissement ;) (le titre de ce sujet est quelque peu lacunaire, j'aurais dû le nommer "echo, le point, la virugle et l'opérateur ternaire").

Mammouth du PHP | 19672 Messages

03 sept. 2005, 14:37

Effectivement, je n'avais pas noté ce détail, voici une correction fonctionnelle: note l'ajout de parenthèses englobant l'expression comportant l'opérateur ternaire:
<?php
$i = "bleus";
echo("Salut les amis ". (isset($i)? $i : ''));
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

03 sept. 2005, 15:22

amusante comme question.

j' ai l'impression que si 'salut les amis' n'est pas affiché avec l'opérateur ternaire et le '.' c'est que 'salut les amis' . (isset($i) est pris comme la condition à évaluer.
php la trouvant vrai il ne te renvoi que 'bleu' et passe à l'as 'salut les amis'.
chose qu'il ne fait pas avec ',' vu que pour lui ',' lui spécifie bien de traiter les instruction les unes à la suite des autres.
ça serait d'ailleur pourquoi la solution de cyrano marcherait vu qu'à l'aide des parenthèses on spécifie bien ce qu'il y a à évaluer.

une variante:
$toto='salut les amis'.isset($i)?$i:'';
$tutu='salut les amis'.(isset($i)?$i:'');
echo $toto;
echo $tutu;
simple hypothèse.

Administrateur PHPfrance
Administrateur PHPfrance | 1275 Messages

03 sept. 2005, 15:24

Le point est en PHP l'opérateur de concaténation. La virgule est un séparateur qui distingue les différents paramètres envoyés dans une fonction.

Donc pour reprendre ton exemple, la bonne formulation est :
<?php

$i = "bleus";

echo 'Salut les amis '. isset($i) ? $i : '';

?>
La concaténation est vraiment mieux que la virgule ? Tu as fais des benchs ?
Car echo accepte plusieurs paramètres, à la base la virgule semble plus logique que la concaténation.

Eléphanteau du PHP | 28 Messages

03 sept. 2005, 16:07

amusante comme question.

j' ai l'impression que si 'salut les amis' n'est pas affiché avec l'opérateur ternaire et le '.' c'est que 'salut les amis' . (isset($i) est pris comme la condition à évaluer.
php la trouvant vrai il ne te renvoi que 'bleu' et passe à l'as 'salut les amis'.
chose qu'il ne fait pas avec ',' vu que pour lui ',' lui spécifie bien de traiter les instruction les unes à la suite des autres.
ça serait d'ailleur pourquoi la solution de cyrano marcherait vu qu'à l'aide des parenthèses on spécifie bien ce qu'il y a à évaluer.

une variante:
$toto='salut les amis'.isset($i)?$i:'';
$tutu='salut les amis'.(isset($i)?$i:'');
echo $toto;
echo $tutu;
simple hypothèse.
Hypothèse intéressante en effet, je n'y avais pas songé. Merci !

En réalité je n'ai aucun problème particulier, c'était juste une question "comme ça", ceci dit cela peut être intéressant à comprendre pour, éventuellement, éviter de se tirer les cheveux lors de l'élaboration d'un code plus complexe, et pour montrer les différences entre la virgule et le point...

Merci aussi Cyrano pour ton code ; j'aurais dû songer aux parenthèses...

D'ailleurs tant que j'y suis, j'ajoute une question ; y'a-t-il une différence entre un echo avec parenthèses (echo ("blabla")) et sans (echo "blabla") ? Ou est-ce strictement équivalent ? (ce que j'aurais tendance à penser)

Eléphant du PHP | 219 Messages

03 sept. 2005, 16:43

Le point est en PHP l'opérateur de concaténation. La virgule est un séparateur qui distingue les différents paramètres envoyés dans une fonction.

Donc pour reprendre ton exemple, la bonne formulation est :
<?php

$i = "bleus";

echo 'Salut les amis '. isset($i) ? $i : '';

?>
La concaténation est vraiment mieux que la virgule ? Tu as fais des benchs ?
Car echo accepte plusieurs paramètres, à la base la virgule semble plus logique que la concaténation.
Salut,

Vu sur php.net :
The benchmark notes from 2002 don't seem to be right any more. I did some loop tests for different kinds of output formatting in PHP 5.0.4. The numbers are the time taken for 10000 iterations:

echo 'Key is ', $k, '<br>',"\n",'Value is ', $v, '<br><br>', "\n";
0.97371506690979
echo 'Key is ', $k, "<br>\nValue is ", $v, '<br><br>', "\n";
0.77851700782776
echo "Key is $k<br>\nValue is $v<br><br>\n";
0.51984405517578
echo 'Key is '. $k. '<br>'."\n".'Value is '. $v. '<br><br>'. "\n";
0.37696409225464

It seems that concatenation is way faster than multiple parameters, and interpolation is pretty good too.
Il est précisé plus loin que cela dépend du nombre d'arguments.