Menu

Heredoc e nowdoc in PHP: stringhe su più righe

Un heredoc PHP è una stringa su più righe che inizia con <<<EOT e termina con EOT; sostituisce le variabili come una stringa tra virgolette doppie. Un nowdoc, <<<'EOT', mantiene il testo esattamente com'è. Impara la sintassi, le regole di indentazione, l'interpolazione di array e oggetti e i template HTML.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Un heredoc è una stringa su più righe. Inizialo con <<<EOT, scrivi il testo nelle righe successive e terminalo con EOT; su una riga a sé. Le variabili all'interno vengono sostituite come in una stringa tra virgolette doppie.

L'identificatore (qui EOT) è una lettera o un underscore seguiti da lettere, cifre o underscore. Di solito si sceglie un nome che dice cos'è il testo: HTML, SQL, TEXT. Alcuni editor, tra cui PhpStorm, evidenziano il corpo in quel linguaggio quando il nome è HTML o SQL.

Costruire un template HTML con heredoc

L'heredoc è il modo più chiaro per scrivere un blocco di HTML con dei valori dentro, perché il markup mantiene la sua forma e non serve fare escape di nulla. L'output è HTML, quindi l'editor lo mostra nella scheda Page.

Due dettagli in quel blocco: l'elemento dell'array è racchiuso tra graffe, {$product['name']}, e il simbolo del dollaro letterale prima del prezzo è escapato come \$. Cambia il nome o aggiungi un tag ed esegui di nuovo.

I valori che arrivano dagli utenti vanno escapati prima di finire nell'HTML. Vedi htmlspecialchars per il perché e il come.

Nowdoc: testo senza interpolazione

Un nowdoc mette l'identificatore tra virgolette singole: <<<'EOT'. Niente all'interno viene sostituito, quindi i simboli del dollaro e le barre rovesciate restano come sono scritti. Usalo per esempi di codice, espressioni regolari e qualsiasi testo che contenga $.

Indentare il marcatore di chiusura

Da PHP 7.3 il marcatore di chiusura può essere indentato, e quell'indentazione viene rimossa da ogni riga del corpo. Così un heredoc dentro una funzione o un if può seguire l'indentazione del codice senza che gli spazi finiscano nella stringa.

La riga con json_encode rende il risultato visibile carattere per carattere: da ogni riga sono stati rimossi 8 spazi, perché la chiusura TEXT; è indentata di 8.

Una riga del corpo indentata meno del marcatore di chiusura è un errore di sintassi:

$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

Array, oggetti e chiamate di metodo dentro un heredoc

L'heredoc segue le stesse regole delle virgolette doppie. Le variabili semplici funzionano da sole; per chiavi di array tra virgolette, array annidati, proprietà e chiamate di metodo, usa le graffe.

L'heredoc come argomento di una funzione

Da PHP 7.3 il marcatore di chiusura può essere seguito da altro codice sulla stessa riga, quindi un heredoc si può passare direttamente a una funzione o mettere in un array. Con sprintf ottieni un template i cui segnaposto vengono riempiti dopo.

Errore comune: punto e virgola mancante o testo in più dopo il marcatore

L'identificatore di chiusura deve essere scritto esattamente come in apertura (stesse maiuscole), e ciò che lo segue su quella riga deve avere senso come PHP. EOT; termina un'istruzione, EOT, continua una lista di argomenti. Una lettera o una cifra subito dopo il marcatore (EOTX;) lo nasconde, quindi la stringa prosegue fino alla fine del file e PHP segnala syntax error, unexpected end of file. La trappola opposta è una riga del corpo che inizia con l'identificatore seguito da uno spazio o da punteggiatura, come EOT is the marker: chiude la stringa in anticipo, e il resto di quella riga viene letto come PHP (syntax error, unexpected identifier "is"). Scegli un identificatore che non compaia mai all'inizio di una riga del testo, come HTML per il markup o SQL per una query.

Domande frequenti

Cos'è un heredoc in PHP?

Un modo per scrivere una stringa su più righe senza virgolette: inizia con <<<EOT e un a capo, scrivi il testo, e termina con EOT; su una riga a sé. Le variabili all'interno vengono sostituite, esattamente come in una stringa tra virgolette doppie, e puoi usare " e ' liberamente.

Qual è la differenza tra heredoc e nowdoc?

Un heredoc (<<<EOT) sostituisce variabili e sequenze di escape come una stringa tra virgolette doppie. Un nowdoc (<<<'EOT', identificatore tra virgolette singole) non fa né l'una né l'altra cosa e mantiene ogni $ e ogni barra rovesciata così come sono scritti, come una stringa tra virgolette singole.

Il marcatore di chiusura dell'heredoc può essere indentato?

Sì, da PHP 7.3. L'indentazione del marcatore di chiusura viene rimossa da ogni riga del corpo, quindi puoi indentare un heredoc in linea con il tuo codice. Ogni riga del corpo deve essere indentata almeno quanto il marcatore di chiusura, altrimenti PHP si ferma con un errore di sintassi.

Come chiamo una funzione dentro un heredoc?

L'heredoc interpola solo variabili, elementi di array, proprietà e chiamate di metodo. Chiama prima la funzione e salva il risultato, oppure tieni il nome della funzione o una closure in una variabile e chiamala dentro le graffe: $e = 'htmlspecialchars'; e poi {$e($text)}.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA