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
Ótima postagem!
Muito bom! Estou aprendendo PHP por conta própria e o artigo foi muito útil. Obrigado.
Parabéns pelo post. Resolveu um grande problema pra mim.
Muito Obrigado !
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.
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.
Parabéns pelo compartilhamento de informação.
Conheci essa sintaxe hoje por acidente, muito legal!!!!
Conheci essa sintaxe hoje... Muito legal!
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com