Menu

Heredoc e nowdoc no PHP: strings de várias linhas

Um heredoc em PHP é uma string de várias linhas que começa com <<<EOT e termina com EOT; ele substitui variáveis como uma string entre aspas duplas. Um nowdoc, <<<'EOT', mantém o texto exatamente como está. Veja a sintaxe, as regras de indentação, a interpolação de arrays e objetos e templates HTML.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Um heredoc é uma string de várias linhas. Comece com <<<EOT, escreva o texto nas linhas seguintes e termine com EOT; numa linha só dele. As variáveis dentro são substituídas como numa string entre aspas duplas.

O identificador (EOT aqui) é uma letra ou um underscore seguido de letras, dígitos ou underscores. As pessoas escolhem nomes que dizem o que é o texto: HTML, SQL, TEXT. Alguns editores, o PhpStorm entre eles, destacam o corpo como aquela linguagem quando o nome é HTML ou SQL.

Montar um template HTML com heredoc

O heredoc é o jeito mais claro de escrever um bloco de HTML com valores dentro, porque a marcação mantém o formato e nada precisa de escape. A saída é HTML, então o editor a mostra na aba Page.

Dois detalhes nesse bloco: o elemento do array está entre chaves, {$product['name']}, e o cifrão literal antes do preço está escapado como \$. Mude o nome ou adicione uma tag e rode de novo.

Valores vindos de usuários precisam ser escapados antes de entrar no HTML. Veja htmlspecialchars para entender por que e como.

Nowdoc: texto sem interpolação

Um nowdoc coloca o identificador entre aspas simples: <<<'EOT'. Nada dentro é substituído, então cifrões e barras invertidas ficam como estão. Use para exemplos de código, expressões regulares e qualquer texto que contenha $.

Indentar o marcador final

Desde o PHP 7.3 o marcador final pode ser indentado, e essa indentação é removida de todas as linhas do corpo. Assim, um heredoc dentro de uma função ou de um if pode seguir a indentação do código sem que os espaços acabem na string.

A linha com json_encode deixa o resultado visível caractere por caractere: 8 espaços foram removidos de cada linha, porque o TEXT; final está indentado em 8.

Uma linha do corpo indentada menos que o marcador final é um erro de sintaxe:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

Arrays, objetos e chamadas de métodos dentro do heredoc

O heredoc segue as mesmas regras das aspas duplas. Variáveis simples funcionam sozinhas; para chaves de array entre aspas, arrays aninhados, propriedades e chamadas de métodos, use chaves.

Heredoc como argumento de função

Desde o PHP 7.3, o marcador final pode ser seguido de mais código na mesma linha, então um heredoc pode ser passado direto para uma função ou colocado num array. Com sprintf você tem um template cujos marcadores são preenchidos depois.

Erro comum: ponto e vírgula faltando ou texto a mais depois do marcador

O identificador final precisa ser escrito exatamente como foi aberto (mesmas maiúsculas e minúsculas), e o que vier depois dele naquela linha precisa fazer sentido como PHP. EOT; encerra uma instrução, EOT, continua uma lista de argumentos. Uma letra ou um dígito logo depois do marcador (EOTX;) o esconde, então a string vai até o fim do arquivo e o PHP informa syntax error, unexpected end of file. A armadilha oposta é uma linha do corpo que começa com o identificador seguido de espaço ou pontuação, como EOT is the marker: ela encerra a string antes da hora, e o resto daquela linha é lido como PHP (syntax error, unexpected identifier "is"). Escolha um identificador que nunca aparece no início de uma linha do texto, como HTML para marcação ou SQL para uma consulta.

Perguntas frequentes

O que é um heredoc no PHP?

Um jeito de escrever uma string de várias linhas sem aspas: comece com <<<EOT e uma quebra de linha, escreva o texto e termine com EOT; numa linha só dele. As variáveis dentro são substituídas, exatamente como numa string entre aspas duplas, e você pode usar " e ' à vontade.

Qual a diferença entre heredoc e nowdoc?

Um heredoc (<<<EOT) substitui variáveis e sequências de escape como uma string entre aspas duplas. Um nowdoc (<<<'EOT', identificador entre aspas simples) não faz nenhuma das duas coisas e mantém cada $ e cada barra invertida como estão, como uma string entre aspas simples.

O marcador final do heredoc pode ser indentado?

Sim, desde o PHP 7.3. A indentação do marcador final é removida de todas as linhas do corpo, então você pode indentar um heredoc para acompanhar o seu código. Toda linha do corpo precisa estar indentada pelo menos tanto quanto o marcador final, ou o PHP para com um erro de sintaxe.

Como chamo uma função dentro de um heredoc?

O heredoc só interpola variáveis, elementos de array, propriedades e chamadas de métodos. Chame a função antes e guarde o resultado, ou guarde o nome da função ou uma closure numa variável e chame-a entre chaves: $e = 'htmlspecialchars'; e depois {$e($text)}.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR