back to top

PHP: le sintassi Heredoc e Nowdoc

PHP dispone di sitassi apposite per la gestione di variabili di tipo stringa molto lunghe o multilinea (si pensi, ad esempio, di dover inserire in una variabile un paragrafo di un testo o un blocco di codice HTML o Javascript). Tali sintassi prendono il nome di Heredoc e Nowdoc.

Prima di descriverne le caratteristiche (e le differenze) facciamo un esempio partendo dall’utilizzo di comuni variabili stringa per gestire un breve testo in HTML:

$sito = 'Mr. Webmaster';
$testo_html = '<article>';
$testo_html .= '<p>Benvenuti su ' . $sito . '<br>';
$testo_html .= 'Il portale dei webmaster italiani in cui puoi trovare:</p>';
$testo_html .= '<ul>';
$testo_html .= '<li>Guide</li>';
$testo_html .= '<li>Articoli tecnici</li>';
$testo_html .= '<li>Script pronti all\'uso</li>';
$testo_html .= '</ul>';
$testo_html .= '</article>';

Per farlo abbiamo utilizzato una variabile che abbiamo scritto su più linee utilizzando un semplice operatore di concatenazione (".").

Nulla di sbagliato, ma decisamente "poco comodo".

Heredoc

Grazie alla notazione Heredoc avremmo potuto fare la stessa cosa in modo molto più semplice. Vediamo un esempio:

$sito = 'Mr. Webmaster';
$testo_html = <<<HTML
<article>
<p>Benvenuti su $sito <br>
Il portale dei webmaster italiani in cui puoi trovare:</p>
<ul>
<li>Guide</li>
<li>Articoli tecnici</li>
<li>Script pronti all'uso</li>
</ul>
</article>
HTML;

Come potete vedere dall’esempio qui sopra:

  • il contenuto della variabile è delimitato da un marker (nel nostro esempio io ho scelto "HTML" ma avrebbe potuto essere qualsiasi altra stringa, ad esempio "PIPPO") che viene ripetuto due volte, all’inizio ed alla fine della stringa;
  • in apertura il marker ("HTML") è preceduto da <<< e in chiusura è seguito dal classico punto e virgola (;);
  • il testo contenuto nella variabile non necessita di escaping ne tantomeno è necessaria la concatenazione dei caratteri.

L’output prodotto dai due blocchi di codice riportati sopra sarà il medesimo.

Se utiliziamo Heredoc per ospitare blocchi di codice possiamo anche scriverli in modo indentato, a tutto vantaggio della leggibilità e manutenibilità del codice stesso! Ad esempio:

$sito = 'Mr. Webmaster';
$testo_html = <<<HTML
<article>
  <p>Benvenuti su $sito <br>
  Il portale dei webmaster italiani in cui puoi trovare:</p>
  <ul>
    <li>Guide</li>
    <li>Articoli tecnici</li>
    <li>Script pronti all'uso</li>
  </ul>
</article>
HTML;

Novità in Heredoc a partire da PHP 7.3

Fino alla versione 7.2 di PHP era assolutamente necessario chiudere la variabile con il marker senza che questo fosse preceduto da spazi vuoti, pena un errore di questo tipo:

Parse error: syntax error, unexpected end of file in ... on line ...

In alter parole un codice formattato in questo modo avrebbe prodotto un errore:

if ($mia_var <= 1) {
  $testo = <<<HTML
  <p>la variabile è minore o uguale a 1</p>
  HTML;
}else{
  $testo = <<<HTML
  <p>la variabile è maggiore di 1</p>
  HTML;
}

echo $testo;

e avremmo dovuto scriverlo così:

if ($mia_var <= 1) {
  $testo = <<<HTML
  <p>la variabile è minore o uguale a 1</p>
HTML;
}else{
  $testo = <<<HTML
  <p>la variabile è maggiore di 1</p>
HTML;
}

echo $testo;

Fortunatamente – a partire dall versione 7.3 di PHP – questo "inconveniente" è stato risolto, a tutto vantaggio della leggibilità del codice!

Nowdoc

Con la versione 5.3 di PHP è stata introdotta la sintassi Nowdoc, morfologicamente molto simile a Heredoc. Ma quale differenza sussiste tra le due tipologie di sintassi?

Prima di rispondere riproponiamo lo stesso esempio visto per Heredoc con Nowdoc:

$sito = 'Mr. Webmaster';
$testo_html = <<<'HTML'
<article>
  <p>Benvenuti su $sito <br>
  Il portale dei webmaster italiani in cui puoi trovare:</p>
  <ul>
    <li>Guide</li>
    <li>Articoli tecnici</li>
    <li>Script pronti all'uso</li>
  </ul>
</article>
HTML;

A prima vista l’unica differenza riguarda il marker di apertura: in Nowdoc questo è delimitato da singoli apici:

<<<'HTML'

Una grossa differenza tra le due notazioni la si può osservare, tuttavia, eseguendo il codice: in Nowdoc, infatti, la variabile $sito non viene sostituita dal suo valore! L’interprete PHP, quindi, tratterà "$sito" come fosse una semplice stringa di testo.

Quando utilizzare Heredoc e quando Nowdoc?

Se non hai bisogno di interpolare variabili ma, più semplicemente, hai bisogno di utilizzare nella tua stringa caratteri speciali come il dollaro ($), Nowdoc risulta più facile da usare. Questa caratteristica rende la Nowdoc particolarmente indicata per l’embedding di codice sorgente o altri contenuti testuali senza la necessità di effettuare alcun escape.

Ad esempio:

$tutorial = <<<'HTML'
<p>Ora stampa "$variabile", poi $obj->pippo.<br>
Ultimo output: {$obj->pluto[o]}.</p>
HTML;

Il risultato generato sarà il segunte:

Ora stampa "$variabile", poi $obj->pippo.
Ultimo output: {$obj->pluto[o]}.

Il tutto senza alcuna "esplosione" di variabile, oggetto o valore di array, anche in caso di utilizzo delle Curly braces e, soprattutto, senza la necessità di una precedente inizializzazione per evitare le generazione di errori.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).
Articolo precedente
Articolo successivo