heredoc è ufficialmente una stringa PHP. Secondo me però il termine più appropriato è stringa-costrutto. Per comodità lo inserisco nella categoria “costrutto”. Premesso questo… heredoc è un costrutto PHP utilizzato per separare il codice PHP dal codice HTML, dai CSS (fogli di stile), dal JavaScript etc. In pratica da tutto ciò che incide sul layout (grafica) di una pagina senza essere “lavorato” dal linguaggio PHP. Questo costrutto ha una grammatica unica, differente da tutti gli altri:
$valore =<<<EOF
// contenuto: variabili, HTML, CSS, JavaScript … etc.
EOF;
heredoc ha una grammatica tutta sua non riscontrabile in nessun altro tipo di stringa e che invece lo avvicina molto ai costrutti PHP, sebbene ci siano profonde differenze tra un costrutto standard come echo e heredoc.
- La chiamata del costrutto avviene scrivendo al posto del suo nome (heredoc) il tag di dichiarazione <<< seguito da tre lettere. chiamale stringa eccezionale o costante. Il significato (per me) è lo stesso Il tag di chiusura è invece rappresentato dalle stesse tre lettere seguite dal punto e virgola. indispensabile come sempre per chiudere l’istruzione
- Il motore PHP tratta gli spazi che seguono l’apertura del tag di dichiarazione o la sua chiusura con una “sensibilità” eccessiva. Anche un solo spazio dopo <<<EOF o EOF; è sufficiente per mandare in tilt il motore PHP, che riconosce nello spazio un errore di linguaggio… ovvero di essere in presenza di uno script difettoso. Il risultato è che nemmeno la funzione error_reporting() è in grado di mandare in output questo tipo di errore. Chiamando in esecuzione lo script “difettoso”, il programmatore si troverà a fissare una tristissima pagina bianca.
- Esiste una evidente difficoltà d’interpretazione da parte del motore PHP nel trattare due heredoc consecutivi non separati da almeno una riga vuota. a volte sono necessarie anche due righe d’intervallo Un esempio per chiarire:
<?php
error_reporting (E_ALL);
$html =<<<EOF
testo
EOF;$html2 =<<<EOF
spazio
EOF;
echo $html.$html2;
?>Mando in esecuzione lo script e ottengo questo output:

Il motore PHP è andato in “pappa” ma non ha bloccato l’esecuzione dello script: mi ha notificato che la variabile $html2 non è stata dichiarata… una notifica falsa perché la variabile è stata dichiarata allo stregua della variabile $html; ha mandato in output la stringa testo EOF; =<<<EOF spazio … il che è tutto dire! Ok. Cambio la seconda dichiarazione. $html2 =<<<EOP e EOP; magari… il risultato è che non ho output da mostrare: pagina bianca.
Il motore ha collassato! Per lui l’unica vera dichiarazione è $html =<<<EOF e la riga EOF;$html2 =<<<EOP la legge (erroneamente) come l’apertura di un tag di dichiarazione heredoc all’interno di un heredoc ancora aperto. Un baco (bug) interessante… ci tornerò tra brevissimo. - La chiamata heredoc (<<<ETC) deve essere seguita da almeno una “andata a capo”, così come la chiusura heredoc (ETC;).
Scrivevo di “bug interessante”. Non è vero che non è possibile annidare heredoc all’interno di un heredoc. E’ possibile ma c’è una differenza sostanziale tra la dichiarazione del primo heredoc e quella dell’heredoc annidato. Il primo è considerato un costrutto dal motore, il secondo è considerato come informazione contenuta nel costrutto e trattata come tale, a patto che la stringa eccezionale (costante) che l’identifica sia differente. In caso contrario il motore PHP non riuscirebbe ad eseguire correttamente l’istruzione.
Mando in esecuzione questo script:
<?php
error_reporting (E_ALL);
$html =<<<EOF
$/php =<<<EOP
testo
EOP;
EOF;
?>
ottenendo questo output:

esecuzione perfetta!
Nota bene: ho inserito $/php invece di $php perché altrimenti il motore PHP l’avrebbe interpretata come una chiamata di variabile, mandando in stampa la stringa =<<<EOP testo EOP; Lo slash (/) tra il simbolo $ e il nome della variabile è un espediente utile nel caso in cui si volesse creare un file PHP con uno script… argomento oggetto di quel php4write.php cui ogni tanto accenno e a cui mi sto avvicinando un giorno dopo l’altro :)
Fin qui la “grammatica” heredoc. Ora un esempio pratico.
Se volessi pubblicare una pagina formattata con codice HTML, CSS etc. avrei due possibili strade da seguire: aprire e chiudere i tag di dichiarazione di PHP lavorando dentro e fuori lo script, etc. oppure utilizzare il costrutto heredoc.
Considera il contenuto di questo file PHP:
<HTML>
<HEAD>
<TITLE>Titolo della Pagina</TITLE>
<STYLE>
BODY {
margin: 0px;
padding: 0px;
background: #000000;
}
DIV {
clear: both;
width: 90%;
margin: 0px;
padding: 12px;
font-family: Arial;
font-size: 12px;
color: #FFF;
}
</STYLE>
</HEAD>
<BODY>
<DIV>
<?php
// lo script lavora su una o più azioni e il risultato è
$nome = “php4people”;
$alert = “Bentornato”;
echo $alert.” “.$nome;
?>
<P><a href=”profilo.php?user=<?=$nome?>“>modifica il tuo profilo</a></P>
</DIV>
</BODY>
</HTML>
Nota bene: Per poter mandare in output fuori da uno script il contenuto di una variabile… bisogna riaprire lo script!
Non ci sono alternative. La grammatica è quella proposta nell’esempio precedente: <?=$nome?>.
Ora modifico il file utilizzando il costrutto heredoc e trasferendo tutto all’interno dello script PHP:
<?php
// lo script lavora su una o più azioni e il risultato è
$nome = “php4people”;// qui c’è una chiamata che verifica che $nome contenga effettivamente qualcosa, se è così:
$alert = “Bentornato “.$nome;
$link_Profilo =<<<EOF
<P><a href=”profilo.php?user=$nome”>modifica il tuo profilo</a></P>
EOF;// assegno alla variabile $html, l’html, i fogli di stile e il contenuto delle altre variabili
$html =<<<EOF
<HTML>
<HEAD>
<TITLE>Titolo della Pagina</TITLE>
<STYLE>
BODY {
margin: 0px;
padding: 0px;
background: #000000;
}
DIV {
clear: both;
width: 90%;
margin: 0px;
padding: 12px;
font-family: Arial;
font-size: 12px;
color: #FFF;
}
</STYLE>
</HEAD>
<BODY>
<DIV>
$alert
$link_Profilo
</DIV>
</BODY>
</HTML>
EOF;// mando in stampa l’HTML
echo $html;
?>
Il risultato, in entrambi i casi, è sempre lo stesso:




[...] heredoc » speciale spesso utilizzata per separare il codice PHP dal layout HTML. [...]
Pingback di [fp4] Definizione di Costrutto in PHP « php4people … 7% refresh — 8 aprile 2008 @ 0:48
[...] [infoParteOrigine] può essere una stringa di qualsiasi tipo o una variabile definita da un qualsiasi tipo d’informazione non necessariamente riconducibile al concetto di stringa. per il discorso “stringa” ti rimando alla definizione di variabile e a heredoc [...]
Pingback di [fp8] str_replace() « php4people … 8% refresh — 9 aprile 2008 @ 0:52
[...] [infoParteOrigine] può essere una stringa di qualsiasi tipo o una variabile definita da un qualsiasi tipo d’informazione non necessariamente riconducibile al concetto di stringa. per il discorso “stringa” ti rimando alla definizione di variabile e a heredoc [...]
Pingback di [fp8] str_replace() « php4people … 11% refresh — 11 aprile 2008 @ 17:36