Heredoc e Nowdoc do PHP

Artigo que apresenta e explica a utilização das notações de string do PHP: Heredoc e Nowdoc.

Heredoc e Nowdoc (também chamados de "here document" e "now document") são duas formas de se representar strings em PHP (assim como existe a representação usando delimitadores com aspas simples e com aspas duplas).


Heredoc do PHP

Heredoc é mais antigo, e sua utilização é mais adequada para criar grandes blocos de texto dentro de código PHP sem a necessidade de se preocupar em escapar aspas duplas ou simples. Ele é semelhante à notação com aspas duplas, já que aceita variáveis e caracteres de controle em seu interior. Portanto, a única preocupação que se teria ao escrever texto com heredoc é escapar o caractere "$" quando deseja utilizar o símbolo de cifrão efetivamente (ao invés de obter uma possível variável).

A sintaxe é bastante simples, basta iniciar a string com três sinais de menor seguidas de um identificador (este identificador pode, opcionalmente, ser delimitado por aspas duplas) e uma quebra de linha, em seguida incluir o texto da string e, por fim encerrar a string com uma linha que apresente apenas o identificador (e ponto e vírgula para indicar fim de instrução, se necessário).

Exemplo:

$html = <<<HTML
  <div id="ajuda">
    <p>Olá {$nome_visitante}.</p>
    <p>O produto abaixo custa R\$ {$preco}.</p>
    <p>Para comprar, clique no botão 'comprar'.</p>
  </div>
HTML;

Este código equivale a:

$html = '  <div id="ajuda">
    <p>Olá '.$nome_visitante.'.</p>
    <p>O produto abaixo custa R$ '.$preco.'.</p>
    <p>Para comprar, clique no botão \'comprar\'.</p>
  </div>';

Ou:

$html = "  <div id=\"ajuda\">
    <p>Olá {$nome_visitante}.</p>
    <p>O produto abaixo custa R\$ {$preco}.</p>
    <p>Para comprar, clique no botão 'comprar'.</p>
  </div>";

Ou seja, Heredoc é uma notação extremamente útil para representar strings que ocupam mais de uma linha. Veja nos outros dois casos que foi necessário escapar as aspas simples, duplas ou o cifrão. Observe, ainda, que delimitei as variáveis com chaves, mas isso não é obrigatório, assim como ocorre com o delimitador de aspas duplas.


Nowdoc do PHP

A notação Nowdoc é semelhante à Heredoc, exceto que ela não aceita variáveis nem caracteres de controle em seu interior. Ela também é mais recente, e foi criada na versão 5.3 do PHP. Por não existir necessidade de escapar nada (inclusive os cifrões), ela é útil para um código PHP, por exemplo, guardar outro código PHP em uma string. Utilizei isso apenas uma vez para fazer um script PHP que gera um arquivo de template para o editor gPHPEdit e para o Eclipse. O conteúdo do template era código PHP, então a notação foi especialmente útil.

A sintaxe é praticamente idêntica à Heredoc, exceto que o identificador usado no início da string deve ser delimitado por aspas simples. O delimitador de fim, por sua vez, continua sem as aspas.

Exemplo:

$codigo_php = <<<'EOF'
/**
 * Operacoes antes de salvar a entidade
 * @param array $dados Dados a serem salvos
 * @return bool
 */
public function pre_salvar($dados) {
    /* código aqui */
}
EOF;

Observe que não foi necessário escapar o cifrão, assim como ocorreria com o Heredoc.

Observação

A linha que indica término de um bloco Heredoc ou Nowdoc não pode ser indentada. Ou seja, se você está em um nível de indentação, pode usar Heredoc ou Nowdoc, mas precisa colocar o identificador de término sem indentação:

    if ($x == 1) {
        $frase = <<<FRASE
<p>bla bla bla</p>
<p>blo blo blo</p>
FRASE;
    }

Fica um pouco esquisito, mas sintaxe é sintaxe, né?

Outra observação é que se o identificador término está na última linha e você não utilizou o "fecha PHP" ("?>"), então precisa criar uma linha em branco após a linha do identificador.


Conclusão

Heredoc é uma forma conveniente de criar strings com quebras de linha que seriam criadas com aspas duplas.

Nowdoc é uma forma conveniente de criar strings com quebras de linha que seriam criadas com aspas simples.

9 comentários

Anônimo disse...

Muito bom! Estou aprendendo PHP por conta própria e o artigo foi muito útil. Obrigado.

Unknown disse...

Muito bom mesmo, ajudou pois tenho um grande código html para inserir pela variável em uma newsletter e isto foi formidável. obrigado.

Anônimo disse...

Faltou dizer que não é uma boa prática fazer isso. Muito por conta da indentação das tags finais, que se tiverem espaços quebram o código restante.