Introduzione
Quando un programma PHP deve generare email, messaggi HTML, query SQL, configurazioni o documenti testuali, concatenare molte stringhe con l’operatore . può rendere il codice difficile da leggere e da mantenere. PHP mette a disposizione due sintassi particolarmente utili per gestire stringhe multilinea: heredoc e nowdoc.
Entrambe permettono di scrivere un testo su più righe mantenendo una struttura simile a quella del risultato finale. La differenza principale riguarda l’interpretazione delle variabili e dei caratteri speciali:
- heredoc: interpreta le variabili e le sequenze di escape, in modo simile alle stringhe racchiuse tra doppi apici;
- nowdoc: tratta il contenuto come testo letterale, senza sostituire le variabili;
- entrambe migliorano la leggibilità quando il contenuto è lungo o contiene più righe.
Queste sintassi sono disponibili da molti anni e sono adatte anche a progetti moderni, purché vengano usate con attenzione rispetto alla sicurezza, soprattutto quando si genera HTML con dati forniti dagli utenti.
Codice completo
<?php
declare(strict_types=1);
// Dati provenienti, ad esempio, da un database
$nome = ´Anna´;
$prodotto = ´Corso di PHP´;
$prezzo = 49.90;
// HEREDOC: le variabili vengono interpretate automaticamente
$email = <<<EMAIL
Ciao $nome,
la tua iscrizione al prodotto "$prodotto" è stata registrata.
Importo totale: € $prezzo.
Grazie per aver scelto il nostro servizio!
EMAIL;
// NOWDOC: le variabili NON vengono interpretate
$testoTecnico = <<<´TESTO´
Esempio di variabile non interpretata:
$nome
$prodotto
$prezzo
TESTO;
// Generazione di HTML sicuro
$nomeHtml = htmlspecialchars($nome, ENT_QUOTES, ´UTF-8´);
$prodottoHtml = htmlspecialchars($prodotto, ENT_QUOTES, ´UTF-8´);
$pagina = <<<HTML
<article>
<h2>Ordine confermato</h2>
<p>Cliente: {$nomeHtml}</p>
<p>Prodotto: {$prodottoHtml}</p>
<p>Prezzo: € {$prezzo}</p>
</article>
HTML;
echo ´<h3>Email</h3>´;
echo nl2br(htmlspecialchars($email, ENT_QUOTES, ´UTF-8´));
echo ´<h3>Testo nowdoc</h3>´;
echo nl2br(htmlspecialchars($testoTecnico, ENT_QUOTES, ´UTF-8´));
echo ´<h3>Pagina HTML</h3>´;
echo $pagina; Spiegazione
La sintassi heredoc
Una stringa heredoc inizia con tre operatori minore, seguiti da un identificatore scelto dallo sviluppatore:
$messaggio = <<<MESSAGGIO
Testo della stringa.
Il valore di una variabile è: $valore
MESSAGGIO; L’identificatore finale deve trovarsi su una riga separata. Nelle versioni moderne di PHP può essere scritto con una certa flessibilità nell’indentazione, ma è comunque consigliabile mantenere una formattazione coerente.
All’interno di heredoc, PHP interpreta le variabili. Per variabili semplici è sufficiente scrivere il nome preceduto dal simbolo $. Quando il nome della variabile è vicino ad altri caratteri, è preferibile usare le parentesi graffe:
$nome = ´Luca´;
$messaggio = <<<TESTO
Ciao {$nome}!
TESTO; Le parentesi graffe rendono esplicito il confine dell’espressione e prevengono ambiguità. È importante ricordare che heredoc non è un motore di template completo: espressioni complesse, condizioni e cicli non dovrebbero essere inseriti direttamente nella stringa.
La sintassi nowdoc
Nowdoc usa un identificatore racchiuso tra apici singoli. Il contenuto viene considerato letterale:
$template = <<<´HTML´
<div>
<p>$nome non verrà sostituito automaticamente.</p>
</div>
HTML; Nowdoc è utile quando il testo contiene molti simboli speciali, esempi di codice, variabili da mostrare letteralmente oppure template che verranno elaborati in un secondo momento da un altro sistema.
Generare HTML in modo sicuro
La comodità di heredoc non deve portare a inserire direttamente dati non affidabili nell’output HTML. Se una variabile proviene da un modulo, da un URL o da un database non validato, bisogna applicare l’escaping appropriato.
$commento = $_POST[´commento´] ?? ´´;
$commentoSicuro = htmlspecialchars(
$commento,
ENT_QUOTES | ENT_SUBSTITUTE,
´UTF-8´
);
$html = <<<HTML
<p>Commento dell´utente:</p>
<blockquote>{$commentoSicuro}</blockquote>
HTML; htmlspecialchars() trasforma caratteri come il simbolo minore, il simbolo maggiore e le virgolette nelle rispettive entità HTML. Questa operazione riduce il rischio di attacchi XSS quando il testo viene inserito in una pagina web.
Best practice
- Scegli un identificatore descrittivo: usa nomi come
EMAIL,HTMLoSQLinvece di identificatori generici. - Non mescolare logica complessa e testo: prepara prima i dati e poi costruisci la stringa.
- Usa heredoc per interpolare valori: è adatto a email e contenuti con dati dinamici.
- Usa nowdoc per testo letterale: è ideale per documentazione, esempi di codice e template non ancora elaborati.
- Esegui l’escaping nel contesto corretto: per HTML usa
htmlspecialchars(); per SQL usa query preparate, non concatenazioni. - Evita di inserire direttamente dati non verificati in JavaScript, CSS, URL o attributi HTML.
- Controlla gli spazi e le nuove righe: una stringa multilinea può includere indentazione e righe vuote inattese.
- Preferisci template dedicati nei progetti grandi: heredoc e nowdoc sono ottimi per blocchi contenuti, ma un motore di template può essere più adatto a pagine complesse.
Riepilogo
Heredoc e nowdoc sono strumenti pratici per scrivere stringhe multilinea in PHP in modo ordinato e leggibile. Heredoc interpreta le variabili, quindi è indicato quando il testo deve contenere valori dinamici. Nowdoc, invece, mantiene il contenuto invariato ed è perfetto per testo letterale o frammenti di codice.
La scelta della sintassi non sostituisce le buone pratiche di sicurezza: quando si genera HTML, i dati esterni devono essere sottoposti a escaping; quando si lavora con SQL, bisogna utilizzare sempre query preparate. Usati correttamente, questi costrutti riducono la concatenazione manuale e rendono più chiari i template presenti nel codice PHP.
