venerdì 27 aprile 2012

Introduzione al PHP: Letterali Stringa (Parte 2/2)

Letterali stringa come blocchi di testo

Esiste infine un altro modo di rappresentare un letterale stringa tramite l'operatore <<< seguito da un identificatore e da un invio. Tutto ciò che segue è interpretato come letterale stringa fino a quando non viene trovato su una nuova linea, posizionato in prima colonna un'altro identificatore uguale al primo. Tutto quanto posto fra le due etichette è il letterale stringa.


Tali letterali stringa sono interpretati come se  fossero racchiusi fra doppi apici ma senza che vi siano i doppi apici. Quindi godono delle sequenza di escape della suddetta forma, ad esclusione della sequenza \" che non ha più motivo di esistere, e del parsing delle variabili che analizzeremo in un prossimo post.

Ad esempio:

$stringa = <<<Etichetta_Letterale_Stringa
Questo è il letterale stringa racchiuso fra etichette.

Da osservare che è interpretato come un letterale racchiuso tra ", ma utilizzando le etichette, il carattere " non ha bisogno della sequenza di escape. Ciò è particolarmente utile nella scrittura di codice HTML in cui formalmente il " racchiude i valori degli attributi dei tag sebbene sia consentito l'uso del ' e per alcuni valori non costituisca un problema l'assenza. Ad esempio

<span class="evidenzia">testo evidenziato</span>
Etichetta_Letterale_Stringa;

Attenzione: l'etichetta di chiusura del letterale deve trovarsi in prima colonna e non può essere indentata, altrimenti l'interprete PHP non rileverà la chiusura del blocco di testo.

    $n=5
    $str = <<<PIPPO
          Questo è il blocco $n
          Hello World!
PIPPO;

In modo implicito l'interprete PHP applica le regole utilizzate per i letterali fra doppi apici, quindi nell'esempio precedente il $n all'interno del letterale è sostituito dal valore della variabile a meno che non si anteponga un back slash al simbolo $.

Nella produzione della stringa in output, i salti riga sono anch'essi prodotti. D'altra parte ciò che si produce è un sorgente da sottoporre all'interpretazione del Browser Web. In tal caso il salto riga è rappresentato a video solo se codificato nel sorgente in codice HTML quale tag <br /> o <br>, così come gli spazi multipli sono rappresentati da un solo spazio a meno che non siano codificati come &nbsp; per ogni spazio. Potremo quindi osservare i salti riga e gli spazi vuoti solo chiedendo al Browser Web di visualizzare il sorgente.

Da PHP 5.3 è però possibile chiedere esplicitamente all'interprete PHP di adottare un preciso metodo d'interpretazione nel valutare il letterale stringa. A tal fine occorre racchiudere la prima etichetta fra apice singolo se si desidera che il letterale sia interpretato con le regole dei letterali stringa tra apici singoli o esplicitare l'interpretazione come letterale fra apice doppio racchiudendo fra apice doppio la prima etichetta

Ad esempio:
$n = 5
$str1 = <<<'EOT'
Ti ho pensato $n volte
\' equivale a \' non ha motivo di esistere l'escaping per l'apice singolo
\\ equivale a \\ ossia non esistendo più l'escaping precedente, anche questo cessa di esistere
EOT;

//Questa forma è equivalente a quella senza l'uso di apici intorno all'etichetta
$str2 = <<<"EOT"
Ti ho pensato $n volte
EOT;

Dato che il letterale è fisicamente racchiuso tra le etichette e non fra gli apici, nell'interpretazione del letterale come racchiuso tra apici singoli non ha più senso la sequenza di escape \' e come conseguenza decade anche la \\ (non è prevista nessuna sequenza di escape). Nel caso di interpretazione del letterale come racchiuso fra apici doppi non è più prevista la sola sequenza di escape \".