PHP - concaténer ou insérer directement des variables dans une chaîne


224

Je me demande, quelle est la bonne façon d'insérer des variables PHP dans une chaîne?

Par ici:

echo "Welcome ".$name."!"

Ou de cette façon:

echo "Welcome $name!"

Ces deux méthodes fonctionnent dans mon PHP v5.3.5. Ce dernier est plus court et plus simple, mais je ne sais pas si le premier est meilleur formatage ou accepté comme plus approprié.


18
si vous faisiez le premier, je préfère personnellement le guillemet simpleecho 'Welcome '.$name.'!';
KJYe.Name 仁家仁


2
@ kjy112 J'ai dit la même chose dans ma réponse, je suis un ÉNORME fan de guillemets simples: X
Khez

11
Personnellement, j'ignore l'intégralité des "guillemets simples sont plus efficaces" et je préfère "utiliser le style de citation qui nécessite le dernier échappement interne". Il est hautement improbable que le code que vous écrivez bénéficiera de gains MICROSCOPIQUES en raison d'une analyse syntaxique des chaînes moindre par rapport à une concaténation accrue des chaînes.
Marc B

1
La réclamation pour perte de performance est fausse. Voir cet article comme référence: nikic.github.io/2012/01/09/…
Damian

Réponses:


344

Entre ces deux syntaxes, vous devriez vraiment choisir celle que vous préférez :-)

Personnellement, j'irais avec votre deuxième solution dans un tel cas (interpolation variable) , que je trouve plus facile à écrire et à lire.

Le résultat sera le même; et même s'il y a des implications en termes de performances, celles-ci n'auront pas d'importance 1 .


En tant que sidenote, ma réponse est donc un peu plus complète: le jour où vous voudrez faire quelque chose comme ceci:

echo "Welcome $names!";

PHP interprétera votre code comme si vous essayiez d'utiliser la $namesvariable - qui n'existe pas. - notez que cela ne fonctionnera que si vous utilisez "" pas '' pour votre chaîne.

Ce jour-là, vous devrez utiliser {}:

echo "Welcome {$name}s!"

Pas besoin de se replier sur les enchaînements.


Notez également que votre première syntaxe:

echo "Welcome ".$name."!";

Pourrait probablement être optimisé , en évitant les concaténations, en utilisant:

echo "Welcome ", $name, "!";

(Mais, comme je l'ai dit plus tôt, cela n'a pas beaucoup d'importance ...)


1 - À moins que vous ne fassiez des centaines de milliers de concaténations vs interpolations - et ce n'est probablement pas tout à fait le cas.


3
Excellent merci! il est très agréable de savoir que je peux utiliser ma méthode préférée pour l'insérer directement dans la chaîne, et je suis très reconnaissant de savoir maintenant comment séparer la variable du reste de la piqûre si besoin est en utilisant le {}.
Web_Designer

64
Juste une note que la séparation des littéraux de chaîne et des variables avec des virgules ne fonctionne qu'avec echo, pas ailleurs.
colincameron

3
Juste pour souligner les performances: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(la concaténation) perd en fait environ 300 millisecondes (pour 200 000 éléments, soit 1 milliseconf pour mille éléments sur votre ensemble ...). C'est du bruit statistique, il est impossible de mesurer une différence. Vu qu'il est plus lisible, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Interpolation) est le vainqueur incontesté ...
Fernando Cordeiro

1
Si vous souhaitez utiliser l'interpolation, vous devez utiliser des guillemets doubles.
Máxima Alekz

est-il possible d'utiliser des fonctions à l'intérieur d'une chaîne? comme echo "C'est {foo ()} sympa"; ?
strix25

17

Les chaînes entre guillemets doubles sont plus élégantes car vous n'avez pas besoin de casser votre chaîne à chaque fois que vous devez insérer une variable (comme vous devez le faire avec les chaînes entre guillemets simples).

Cependant, si vous devez insérer la valeur de retour d'une fonction, cela ne peut pas être inséré dans une chaîne entre guillemets doubles - même si vous l'entourez d'accolades!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

10
Vous pouvez insérer des fonctions semi-indirectement dans des chaînes via des fonctions variables PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", qui contourne la "restriction".
Marc B

5
@Marc C'est cool, je ne savais pas ça! Vous pouvez également attribuer le nom d'une fonction existante à une variable et faire la même chose:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael

3
c'est cool mais extrêmement illisible, alors, il faut quand même l'éviter.
Votre bon sens le

2
$s = 'Hello ' . trim($world) .'!';Essayez d'utiliser des guillemets simples lorsqu'il n'y a rien à interpoler dans la chaîne. Cela améliorera les performances et peut être utilisé comme une convention pour identifier les deux
Sarath Sadasivan Pillai

9

Depuis php4, vous pouvez utiliser un formateur de chaînes:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

Source: sprintf ()


De loin l'option la plus sûre. +1 pour les bonnes pratiques et la convention générale correspondant à d'autres langues
Javier Arias

6

Soit on va bien. Utilisez celui qui a une meilleure visibilité pour vous. Et en parlant de visibilité, vous pouvez également consulter printf .


5

Du point de vue de rendre la pensée simple , lisible , cohérente et facile à comprendre (car les performances n'ont pas d'importance ici):

  • L'utilisation de variables intégrées dans des guillemets doubles peut conduire à des situations complexes et déroutantes lorsque vous souhaitez incorporer des propriétés d'objet, des tableaux multidimentionnels, etc. En général, lorsque vous lisez des variables intégrées, vous ne pouvez pas être instantanément sûr à 100% du comportement final de ce que vous lisez. .

  • Vous avez souvent besoin d'ajouter des béquilles telles que {}et \, ce qui ajoute de la confusion à l'OMI et rend la lisibilité de la concaténation presque équivalente, sinon meilleure.

  • Dès que vous devez encapsuler un appel de fonction autour du var, par exemple htmlspecialchars($var), vous devez basculer en concaténation.

  • AFAIK, vous ne pouvez pas incorporer de constantes.

Dans certains cas spécifiques, les "guillemets doubles avec intégration de variables" peuvent être utiles, mais de manière générale, j'opterais pour la concaténation (en utilisant des guillemets simples ou doubles lorsque cela est pratique)


5

Je sais que cette question a déjà une réponse choisie, mais j'ai trouvé cet article qui montre évidemment que l'interpolation de chaînes fonctionne plus rapidement que la concaténation. Cela pourrait être utile pour ceux qui ont encore des doutes.


3

Allez avec le premier et utilisez des guillemets simples!

  1. C'est plus facile à lire, ce qui signifie que les autres programmeurs sauront ce qui se passe
  2. Cela fonctionne un peu plus vite, la façon dont les opcodes sont créés lorsque PHP dissèque votre code source, ça va le faire de toute façon, alors donnez-lui un coup de main!
  3. Si vous utilisez également des guillemets simples au lieu de guillemets doubles, vous améliorerez encore plus vos performances.

Les seules situations où vous devez utiliser des guillemets doubles, est quand vous avez besoin \r, \n, \t! Les frais généraux ne valent tout simplement pas la peine d'être utilisés dans les autres cas.

Vous devriez également vérifier la concaténation des variables PHP , phpbench.com pour quelques repères sur différentes méthodes de faire les choses.


19
-1: L'utilisation de guillemets simples n'a aucun effet réel sur les performances. La page liée montre les différences entre les deux méthodes en microsecondes , soit 0,000001 secondes. Toute requête de base de données va prendre des centaines de fois. Ce débat est totalement inutile.
Pekka

Bon point à mentionner \r, \net \tcomme d'autres réponses ne comprenaient pas ce bit.
evilReiko

2

Ce n'est qu'une question de goût.
Utilisez ce que vous voulez.

La plupart du temps, j'utilise le second, mais cela dépend.

Permettez-moi de vous suggérer également de vous procurer un bon éditeur qui mettra en évidence une variable à l'intérieur d'une chaîne


J'ai la zone de texte nécessaire. Roches PSPad .
Web_Designer

2

Ne pas concaténer. Ce n'est pas nécessaire, nous les virgules car l'écho peut prendre plusieurs paramètres

echo "Welcome ", $name, "!";

En ce qui concerne l'utilisation de guillemets simples ou doubles, la différence est négligeable, vous pouvez faire des tests avec un grand nombre de chaînes pour tester par vous-même.


6
Cela ne s'applique cependant qu'à l'écho. Essayez-le pour une affectation de variable et regardez votre code exploser.
Marc B

1

Vous devez choisir le premier. Ils n'ont pas de différence sauf la performance la première sera la plus rapide dans la comparaison de la seconde.

Si la variable à l'intérieur du guillemet double PHP prend du temps pour analyser la variable.

Consultez ces guillemets simples ou doubles pour la concaténation de variables?

Ceci est un autre exemple Y a-t-il un avantage de performance entre guillemets simples et guillemets doubles en php?

Je n'ai pas compris pourquoi cette réponse dans le lien ci-dessus est votée positivement et pourquoi cette réponse a été rejetée.

Comme je l'ai dit la même chose.

Vous pouvez aussi regarder ici

Quoi de plus rapide en PHP, guillemets simples ou doubles?


5
-1 pour une optimisation prématurée. La différence de performances n'est pas suffisante pour être un facteur à moins que vous n'imprimiez des millions de fois dans un script - et même dans ce cas, tout autre traitement que vous effectuez éclipsera les quelques secondes supplémentaires que vous pourriez passer à imprimer dans un sens plutôt que dans l'autre. . La principale différence entre eux est la lisibilité (ce qui m'amène à préférer le second style).
cHao

1
Je peux essayer de répondre à votre dernière question. Il existe de nombreuses rumeurs sauvages dans la communauté PHP et certaines d'entre elles sont très fortes. C'est très difficile de les divulguer et cela prend du temps. Mais lentement, ça change. Donc, la réponse à laquelle vous avez lié est ancienne, à partir du moment où les gens s'en fichaient. Alors que dans celui-ci, certaines personnes ont répondu sur la base de leur propre expérience, pas sur un article qu'ils ont lu.
Votre bon sens

La perte de performances est fausse +1 @cHao. Voici un article avec les mesures le prouvant. nikic.github.io/2012/01/09/…
Damian

1

Si vous souhaitez exécuter une SQLcommande et que vos variables sont des membres du tableau, vous ne devez pas utiliser de guillemets simples à l'intérieur []du tableau (comme ceci:) ['']; par exemple, si vous utilisez cette chaîne comme une commande SQL, vous obtenez server error 500:

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

La chaîne correcte est:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";

Vous devriez utiliser des PDO à la place
s3c

0

Je sais que c'est une vieille question, mais je pense que quelqu'un doit mentionner tous les avantages et les inconvénients:

Meilleure syntaxe : c'est une préférence personnelle.

Performance : Aucune différence. Comme beaucoup l'ont mentionné, les guillemets doubles peuvent être plus rapides si vous utilisez de nombreuses variables irréalistes.

Meilleure utilisation : devis unique (principalement). Comme @Khez dit, en citant simple , vous pouvez concaténer quoi que ce soit, même des appels de fonction et de modification variables, comme suit: echo 'hi ' . trim($name) . ($i + 1);. La seule chose guillemet peut le faire une seule citation ne peut pas faire est l' utilisation de \n, \r, \tet aussi bien.

Lisibilité : aucune différence (des préférences personnelles peuvent s'appliquer).

Écriture / Réécriture / Débogage : Dans les instructions à une ligne, il n'y a pas de différence, mais lorsqu'il s'agit de plusieurs lignes, il est plus facile de commenter / décommenter des lignes pendant le débogage ou l'écriture. Par exemple:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

Moins d'échappatoire : guillemet simple. Pour les guillemets simples, vous devez échapper à 2 caractères uniquement ( 'et\ ). Pour les guillemets doubles, vous devez échapper 2 caractères ( ", \) et 3 autres si nécessaire ( $, {et} ).

Moins de changements : devis unique. Par exemple, si vous disposez du code suivant:

echo 'Number ' . $i . '!';

Et vous devez incrémenter 1 à $ i, donc ça devient des likes:

echo 'Number ' . ($i + 1) . '!';

Mais pour une citation double, vous devrez changer ceci:

echo "Number $i!";

pour ça:

echo "Number " . ($i + 1) . "!";

Conclusion : utilisez ce que vous préférez .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.