Concatenar ou inserir diretamente variáveis ​​na string

224

Gostaria de saber qual é a maneira correta de inserir variáveis ​​PHP em uma string?

Deste jeito:

echo "Welcome ".$name."!"

Ou assim:

echo "Welcome $name!"

Ambos os métodos funcionam no meu PHP v5.3.5. O último é mais curto e mais simples, mas não tenho certeza se o primeiro é de melhor formatação ou aceito como mais adequado.

Web designer
fonte
18
se você estivesse fazendo o primeiro, eu, pessoalmente, prefiro aspas simplesecho 'Welcome '.$name.'!';
KJYe.Name葉家仁
1
php.net/manual/en/…
Dejan Marjanovic
2
@ kjy112 eu disse a mesma coisa em minha resposta, eu sou um grande fã de aspas simples: X
Khez
11
Pessoalmente, ignoro todas as "aspas simples são mais eficientes" e simplesmente uso "qualquer estilo de citação que exija a última quantidade de escape interno". É altamente improvável que qualquer código que você escreva se beneficie de quaisquer ganhos MICROSCOPIC devido a menos análise de string versus maior concatenação de string.
Marc B
1
A reivindicação de perda de desempenho é falsa. Veja este artigo como referência: nikic.github.io/2012/01/09/…
Damian

Respostas:

344

Entre essas duas sintaxes, você realmente deve escolher a que preferir :-)

Pessoalmente, eu usaria sua segunda solução nesse caso (interpolação variável) , que acho mais fácil escrever e ler.

O resultado será o mesmo; e mesmo se houver implicações no desempenho, elas não serão importantes 1 .


Como nota de rodapé, minha resposta é um pouco mais completa: no dia em que você desejar fazer algo assim:

echo "Welcome $names!";

O PHP interpretará seu código como se você estivesse tentando usar a $namesvariável - que não existe. - note que só funcionará se você "" não '' para sua string.

Nesse dia, você precisará usar {}:

echo "Welcome {$name}s!"

Não há necessidade de recuar para concatenações.


Observe também que sua primeira sintaxe:

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

Provavelmente poderia ser otimizado , evitando concatenações, usando:

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

(Mas, como eu disse anteriormente, isso não importa muito ...)


1 - A menos que você esteja fazendo centenas de milhares de concatenações x interpolações - e provavelmente não é bem assim.

Pascal MARTIN
fonte
3
Excelente, obrigado! é muito bom saber que posso usar meu método favorito de inseri-lo diretamente na string, e estou muito agradecido por saber agora como separar a variável do resto da picada, se necessário, usando o {}.
Web_Designer
64
Apenas uma observação de que separar os literais e as variáveis ​​de seqüência de caracteres com vírgulas só funciona echo, e em nenhum outro lugar.
Colincameron
3
Apenas apontando o desempenho: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Concatenação) na verdade perde cerca de 300 milissegundos (para 200.000 itens, isso significa 1 milissegundo por mil elementos em seu conjunto ...). Isso é ruído estatístico, é impossível medir qualquer diferença. Considerando que é mais legível, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(interpolação) é o vencedor indiscutível ...
Fernando Cordeiro
1
Se quiser usar a interpolação, é necessário usar aspas duplas.
Máxima Alekz
é possível usar funções dentro de string? como echo "Isso é agradável (foo ()}"; ?
strix25
17

As strings entre aspas duplas são mais elegantes porque você não precisa dividir sua string toda vez que precisar inserir uma variável (como você deve fazer com strings entre aspas simples).

No entanto, se você precisar inserir o valor de retorno de uma função, ele não poderá ser inserido em uma cadeia de caracteres entre aspas duplas - mesmo se você a envolver com chaves!

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

//the only option
$s = "Hello " . trim($world) . "!";
Michael
fonte
10
Você pode inserir funções semi-indiretamente em strings através das funções variáveis ​​do PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", que contorna a "restrição".
Marc B
5
@ Marc Isso é legal, eu não sabia disso! Você também pode atribuir o nome de uma função existente a uma variável e fazer a mesma coisa:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael
3
isso é legal, mas extremamente ilegível; portanto, é preciso evitá-lo de qualquer maneira.
Seu senso comum
2
$s = 'Hello ' . trim($world) .'!';Tente usar aspas simples quando não há nada para interpolar em string.It irá melhorar o desempenho e pode ser usado como uma convenção para identificar tanto
Sarath Sadasivan Pillai
9

Desde php4 você pode usar um formatador de strings:

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

Fonte: sprintf ()

Olivier Royo
fonte
De longe a opção mais segura. +1 para boas práticas e convenções gerais correspondentes a outros idiomas
Javier Arias
6

Qualquer um está bom. Use o que tiver melhor visibilidade para você. E por falar em visibilidade, você também pode conferir printf .

Manos Dilaverakis
fonte
5

Do ponto de vista de tornar o pensamento simples , legível , consistente e fácil de entender (já que o desempenho não importa aqui):

  • O uso de vars incorporados entre aspas duplas pode levar a situações complexas e confusas quando você deseja incorporar propriedades de objetos, matrizes multidimensionais etc. Ou seja, geralmente ao ler vars incorporados, você não pode ter instantaneamente 100% de certeza do comportamento final do que está lendo .

  • Você frequentemente precisa adicionar muletas como {}e \, o que IMO gera confusão e torna a legibilidade da concatenação quase equivalente, se não melhor.

  • Assim que você precisar encerrar uma chamada de função em torno do var, por exemplo htmlspecialchars($var), precisará mudar para concatenação.

  • AFAIK, você não pode incorporar constantes.

Em alguns casos específicos, "aspas duplas com incorporação de vars" pode ser útil, mas de um modo geral, eu usaria concatenação (usando aspas simples ou duplas, quando conveniente)

Z gelado
fonte
5

Sei que esta pergunta já tem uma resposta escolhida, mas encontrei este artigo que mostra evidentemente que a interpolação de cadeias funciona mais rápido que a concatenação. Pode ser útil para quem ainda está em dúvida.

Denis V
fonte
3

Vá com o primeiro e use aspas simples!

  1. É mais fácil de ler, o que significa que outros programadores saberão o que está acontecendo
  2. Funciona um pouco mais rápido, da maneira como os opcodes são criados quando o PHP disseca seu código-fonte, ele basicamente faz isso de qualquer maneira, então, ajude-o!
  3. Se você também usar aspas simples, em vez de aspas duplas, aumentará ainda mais seu desempenho.

As únicas situações em que você deve usar aspas duplas, é quando você precisa \r, \n, \t! A sobrecarga simplesmente não vale a pena usá-la em qualquer outro caso.

Você também deve verificar a concatenação de variáveis ​​PHP , phpbench.com , para obter alguns benchmarks sobre diferentes métodos de fazer as coisas.

Khez
fonte
19
-1: o uso de aspas simples não afeta o desempenho da vida real. A página vinculada mostra diferenças entre os dois métodos em microssegundos , ou seja, 0,000001 segundos. Qualquer consulta ao banco de dados levará centenas de vezes esse tempo. Este debate é totalmente inútil.
Pekka
Bom ponto para mencionar e \r, como outras respostas, não incluíam esse trecho. \n\t
evilReiko
2

É apenas uma questão de gosto.
Use o que quiser.

Na maioria das vezes eu estou usando o segundo, mas isso depende.

Deixe-me sugerir que você também consiga um bom editor que realce uma variável dentro de uma string

Seu senso comum
fonte
Eu tenho a área de texto necessária. PSPad rochas.
Web_Designer 09/04
2

Não concatenar. Não é necessário, vírgulas como o eco pode assumir vários parâmetros

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

Quanto ao uso de aspas simples ou duplas, a diferença é insignificante, você pode fazer testes com um grande número de strings para testar por si mesmo.

David Gillen
fonte
6
Isso se aplica apenas ao eco, no entanto. Experimente para uma atribuição de variável e observe seu código explodir.
Marc B
1

Você deve escolher o primeiro. Eles não têm diferença, exceto o desempenho, o primeiro será o mais rápido na comparação do segundo.

Se a variável dentro do PHP entre aspas duplas demorar para analisar a variável.

Confira esta aspas simples ou duplas para concatenação de variáveis?

Este é outro exemplo. Existe um benefício de desempenho entre aspas simples e aspas duplas no php?

Não entendi por que essa resposta no link acima foi votada e por que essa resposta foi reduzida com o voto.

Como eu disse a mesma coisa.

Você pode olhar aqui também

O que é mais rápido no PHP, aspas simples ou duplas?

Shakti Singh
fonte
5
-1 para otimização prematura. A diferença no desempenho não é suficiente para ser um fator, a menos que você esteja imprimindo milhões de vezes em um script - e mesmo assim, qualquer outro processamento que você fizer diminuirá os segundos extras que você pode gastar imprimindo de uma maneira em vez da outra . A principal diferença entre eles é a legibilidade (o que me leva a preferir o segundo estilo).
Chao
1
Eu posso tentar responder sua última pergunta. Existem muitos rumores na comunidade PHP e alguns deles são muito fortes. É uma grande luta divulgá-las e leva tempo. Mas lentamente está mudando. Portanto, a resposta à qual você vinculou é antiga, desde os momentos em que as pessoas não se importavam. Enquanto neste, algumas pessoas respondem com base em sua própria experiência, não em algum artigo que lêem.
Seu senso comum
A perda de desempenho é falsa +1 @cHao. Aqui está um artigo com as métricas que a provam. nikic.github.io/2012/01/09/…
Damian
1

Se você deseja executar um SQLcomando e suas variáveis ​​são membros da matriz, não use aspas simples dentro []da matriz (assim:) ['']; por exemplo, se você usar essa sequência como um comando SQL, obtém 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)

A sequência correta é:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";
Hamid Araghi
fonte
Você deve usar PDOs
s3c 30/03
0

Sei que essa é uma pergunta antiga, mas acho que alguém precisa mencionar todos os prós e contras:

Melhor sintaxe : essa é a preferência pessoal.

Desempenho : sem diferença. Como muitos mencionados, as aspas duplas podem ser mais rápidas se você usar muitas variáveis ​​irrealisticamente.

Melhor uso : aspas simples (principalmente). Como disse @Khez, com aspas simples você pode concatenar nada, chamadas de função mesmo e modificação variável, assim: echo 'hi ' . trim($name) . ($i + 1);. A única coisa double-quote pode fazer isso aspa simples não pode fazer é o uso de \n, \r, \te afins.

Legibilidade : Não há diferença (pode haver preferência pessoal).

Gravação / regravação / depuração : nas instruções de 1 linha não há diferença, mas ao lidar com várias linhas, é mais fácil comentar / descomentar linhas durante a depuração ou gravação. Por exemplo:

$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';

Menos escape : aspas simples. Para aspas simples, você precisa escapar apenas de 2 caracteres ( 'e \). Para aspas duplas, você precisa escapar de 2 caracteres ( ", \) e mais 3, se necessário ( $, {e }).

Menos alterações : aspas simples. Por exemplo, se você tiver o seguinte código:

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

E você precisa aumentar de 1 a $ i, para que se torne algo como:

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

Mas, para aspas duplas, você precisará alterar isso:

echo "Number $i!";

para isso:

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

Conclusão : use o que preferir .

evilReiko
fonte