Qual é a diferença entre strings entre aspas simples e duplas no PHP?


796

Estou um pouco confuso por que vejo algum código no PHP com a string colocada entre aspas simples e às vezes entre aspas duplas.

Eu só sei no .NET, ou na linguagem C, se estiver entre aspas simples, isso significa que é um caractere, não uma string.

Respostas:


1086

As strings do PHP podem ser especificadas não apenas de duas maneiras, mas de quatro maneiras.

  1. As strings entre aspas simples exibirão as coisas quase completamente "como estão". Variáveis ​​e a maioria das seqüências de escape não serão interpretadas. A exceção é que, para exibir uma aspas simples literal, você pode escapar com uma barra invertida\'e, para exibir uma barra invertida, pode escapar com outra barra invertida\\( portanto, sim, até as seqüências de caracteres entre aspas simples são analisadas ).
  2. As strings de aspas duplas exibirão uma série de caracteres de escape (incluindo algumas expressões regulares) e as variáveis ​​nas strings serão avaliadas. Um ponto importante aqui é que você pode usar chaves para isolar o nome da variável que deseja avaliar . Por exemplo, digamos que você tenha a variável$typee desejaecho "The $types are". Que vai olhar para a variável$types. Para contornar esse usoecho "The {$type}s are"Você pode colocar a chave esquerda antes ou depois do cifrão. Dê uma olhada na análise de strings para ver como usar variáveis ​​de matriz e outras coisas.
  3. A sintaxe da cadeia Heredoc funciona como cadeias de caracteres duplas. Começa com<<<. Após esse operador, é fornecido um identificador e, em seguida, uma nova linha. A sequência em si segue e, em seguida, o mesmo identificador novamente para fechar a cotação. Você não precisa escapar de aspas nesta sintaxe.
  4. A sintaxe de string do Nowdoc (desde o PHP 5.3.0) funciona essencialmente como strings de aspas simples. A diferença é que nem mesmo aspas simples ou barras invertidas precisam ser escapadas. Um nowdoc é identificado com a mesma<<<sequência usada para heredocs, mas o identificador a seguir é colocado entre aspas simples, por exemplo<<<'EOT'. Nenhuma análise é feita no nowdoc.

Notas: As aspas simples dentro das aspas simples e as aspas duplas dentro das aspas duplas devem ser escapadas:

$string = 'He said "What\'s up?"';
$string = "He said \"What's up?\"";

Velocidade:
eu não daria muita importância às aspas simples, sendo mais rápidas que as aspas duplas. Eles provavelmente são mais rápidos em determinadas situações. Aqui está um artigo explicando uma maneira pela qual aspas simples e duplas são essencialmente igualmente rápidas desde o PHP 4.3 ( Useless Optimizationsna parte inferior, seção C). Além disso, esta página de benchmarks possui uma comparação de cotação única vs dupla. A maioria das comparações é a mesma. Há uma comparação em que aspas duplas são mais lentas que aspas simples.


17
+1 para o truque entre chaves. Não estava ciente disso. Pena que não segue as mesmas convenções que os scripts de shell, ou seja ${variablename}.
devios1

6
Eu só uso aspas duplas, quando preciso \n, qualquer outra coisa no meu PHPcódigo está entre aspas simples.
Jo # Smo4

parece que 'heredoc' é portado para o PHP a partir do bash ou não é? De qualquer forma ótima resposta, então um +1 Obrigado.
Sjsam

2
Nota interessante nos comentários da documentação do PHP: php.net/manual/en/language.types.string.php#120160 - "As strings de aspas duplas", que parecem tão lentas que já que precisam analisar tudo \ n barras invertidas e $ dollar sinais para fazer expansão variável ", acabou sendo o método de concatenação de string MAIS RÁPIDO do PHP - PERIOD! As aspas simples são mais rápidas se sua string for completamente literal (sem nada para analisar e nada para concatenar), mas a margem é muito pequeno e não importa ".
dregad

1
Nota: a lentidão das "aspas duplas é uma coisa do passado. As atualizações aumentaram o processamento de aspas duplas para ser o mais rápido, em todos os casos, exceto nos extremos, atualmente.
precisa saber é o seguinte

211

As coisas são avaliadas entre aspas duplas, mas não em uma única:

$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.

1
As aspas simples com escape e as barras invertidas com escape são expandidas mesmo em cadeias de caracteres entre aspas simples.
precisa saber é o seguinte

43
Um erro que muitos desenvolvedores iniciantes no PHP estão executando: $mailbody = 'I want a line break:\nDone.';é manter \nvivo. Visto que: $mailbody = "I want a line break:\nDone.";irá analisar a quebra de linha.
Kai Noack

Meus dois centavos são necessários apenas para entrevistas ou para o desenvolvimento de malware. Basta comparar var_dump () de duas expressões: $testWithAsciiAndUtf8Characters = "\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!"; $simpleTest = '\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!'; As seqüências de caracteres $testWithAsciiAndUtf8Charactersforam transformadas em string com letras reais.
Rostyslav Pylypenko

56

' Único citado

A maneira mais simples de especificar uma string é colocá-la entre aspas simples. As aspas simples geralmente são mais rápidas e tudo o que é citado por dentro é tratado como uma sequência simples.

Exemplo:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;

" Duplo citado

Use aspas duplas no PHP para evitar ter que usar o período para separar o código (Nota: Use chaves {}para incluir variáveis ​​se você não quiser usar o .operador concatenation ( )) na string.

Exemplo:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";

Existe um benefício de desempenho entre aspas simples e aspas duplas no PHP?

Sim. É um pouco mais rápido usar aspas simples.

O PHP não usará processamento adicional para interpretar o que está dentro da aspas simples. Quando você usa aspas duplas, o PHP precisa analisar para verificar se existem variáveis ​​dentro da string.


A única exceção para aspas simples NÃO analisar nada na cadeia é o que você pode usar \'para escapar de um único apóstrofo para uso dentro da cadeia (ou \\'para exibir a barra invertida). Observe que as seqüências de escape tradicionais, como \nNÃO serão analisadas para o caractere de nova linha. Documentação do PHP sobre strings
SherylHohman

Vejo em todas as respostas que: você pode usar o nome da variável entre aspas duplas para imprimir o valor da variável, mas você está dizendo que o nome da variável também deve ser colocado entre chaves para evitar a necessidade de usar uma concatenação período. Portanto, se "$ my_var" e "{$ my_var}" geram o valor de $ my_var, para que servem? Obrigado!
Bahman.A

40

Uma sequência de aspas simples não possui variáveis ​​interpretadas. Uma string com aspas duplas faz.

Além disso, uma sequência de aspas duplas pode conter apóstrofos sem barras invertidas, enquanto uma sequência de aspas simples pode conter aspas sem escape.

As strings de aspas simples são mais rápidas no tempo de execução porque não precisam ser analisadas.


8
As strings entre aspas simples também usam menos memória. A maneira mais rápida de lidar com strings no PHP é com aspas simples e usando o. operador para concatenar seqüências de caracteres e variáveis.
precisa saber é o seguinte

hmmm, me corrija se eu estiver errado, mas a linguagem base do PHP é C, certo? Então, por que as aspas das strings diferem em PHP e C?
Rob waminal

1
@rob waminal: PHP pode ser implementado em C, mas é uma linguagem diferente. A linguagem PHP especifica essas semânticas.
Borealid 10/08/10

@ Ribald - A sintaxe do doc agora não seria mais rápida? As strings entre aspas simples são analisadas para aspas simples e barras invertidas.
Peter Ajtai

@ Peter, você pode estar correto, eu nunca me preocupei em realmente cavar isso. A documentação do PHP faz a afirmação de velocidade, decidi acreditar nos documentos sobre fé. :)
RibaldEddie

27

No PHP, ambos 'my name'e "my name"são string. Você pode ler mais sobre isso no manual do PHP .

Coisa que você deve saber são

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

Em PHP, as pessoas usam aspas simples para definir uma string constante, como 'a', 'my name', 'abc xyz', ao usar aspas duplas para definir uma string conter identificador como "a $b $c $d".

E outra coisa é,

echo 'my name';

é mais rápido que

echo "my name";

mas

echo 'my ' . $a;

é mais lento que

echo "my $a";

Isso é verdade para outros usados ​​de string.


18

Exemplo de aspas simples, duplas, heredoc e agora

<?php

    $fname = "David";

    // Single quotes
    echo 'My name is $fname.'; // My name is $fname.

    // Double quotes
    echo "My name is $fname."; // My name is David.

    // Curly braces to isolate the name of the variable
    echo "My name is {$fname}."; // My name is David.

    // Example of heredoc
    echo $foo = <<<abc
    My name is {$fname}
    abc;

        // Example of nowdoc
        echo <<< 'abc'
        My name is "$name".
        Now, I am printing some
    abc;

?>

16

No PHP, o texto de aspas simples é considerado como valor da string e o texto de aspas duplas analisará as variáveis ​​substituindo e processando seu valor.

$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test

Aqui, aspas duplas analisam o valor e aspas simples são consideradas como valor da string (sem analisar a $testvariável).


12

Ambos os tipos de caracteres fechados são cadeias de caracteres. Um tipo de cotação é convenientemente usado para incluir o outro tipo de cotação. "'" e '"'. A maior diferença entre os tipos de aspas é que as referências de identificador incluídas são substituídas por aspas duplas, mas não por aspas simples.


3

A diferença entre usar aspas simples e aspas duplas no php é que, se usarmos aspas simples na instrução echo, ela será tratada como uma string. ... mas se inserirmos o nome da variável entre aspas duplas, ele produzirá o valor dessa variável junto com a string.


0

Aqui algumas possibilidades de aspas simples e duplas com variável

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

Uma Coisa:

É muito importante observar que a linha com o identificador de fechamento do Heredoc não deve conter outros caracteres, exceto um ponto e vírgula (;) . Isso significa especialmente que o identificador não pode ser recuado e não pode haver espaços ou tabulações antes ou depois do ponto e vírgula.

Exemplo:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
Esta é uma afirmação verdadeira, mas não tem nada a ver com a pergunta aqui.
precisa saber é o seguinte

-1

Talvez eu esteja um pouco atrasado e um pouco fora de tópico, mas aqui está assim mesmo:

Você não precisa necessariamente escolher por causa do conteúdo da sua string entre:
alert("It's \"game\" time."); oualert('It\'s "game" time.');

Se você estiver familiarizado com o uso das aspas em inglês e o caractere correto para o apóstrofo, poderá usar aspas duplas ou simples, pois isso não importará mais:
alert("It’s “game” time.");ealert('It’s “game” time.');

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.