Costrutti echo(), print() e stringhe heredoc

Requisiti

  • Minima conoscenza del PHP

Visione generale

Partiamo subito dal dire che echo() e print() non sono funzioni bensì costrutti di linguaggio quindi con le seguenti conseguenze:

  • Non sono richieste le parentesi per inserire una lista di argomenti;
  • Non esiste il concetto di funzione variabile (ossia se ad una variabile aggiungiamo la parentesi aperta e chiusa alla fine, PHP non cercherà la funzione con il medesimo nome);

La funzione importante che svolgono questi due costrutti riguarda la possibilità di visualizzare stringhe di testo sulla pagina Web (oppure tramite linea di comando con il risultato nello standard output della console).

Il costrutto echo()

Partiamo subito esaminando un esempio semplice semplice:

  1. < ?php
  2. $nome='Daniele';
  3. $cognome='Simonin';
  4.  
  5. echo "Nome:$nome<br/>Cognome:$cognome";
  6. /*
  7. Nome:Daniele
  8. Cognome:Simonin
  9. */
  10. ?>

Come si può notare definisco due variabile di tipo stringa con il mio nome e cognome per poi visualizzarlo con l’echo().
Nel costrutto echo() la specificazione delle stringhe può avvenire in due modi:

  • Utilizzando le virgolette doppie “”;
  • Utilizzando le virgolette singole ”;

La scelta non è per niente casuale visto che utilizzando le virgolette doppie ho diritto al seguente trattamento:

  • Qualunque variabile viene espansa (come nell’esempio);
  • Possibilità di usare un buon numero di sequenze di escape quali:
    • n Per il ritorno a capo;
    • r Il cursore salta all’inizio della riga corrente;
    • t Tabulazione;
    • \ Visualizza la barra rovesciata;
    • $ Visualizza il dollaro;
    • Visualizza le doppie virgolette;
    • [0-7] Carattere specificato in forma ottale in conformità con lo standard ASCII;
    • x[0-9A-Fa-f] Carattere specificato in forma esadecimale in conformità con lo standard ASCII (ad esempio scrivendo x4C viene visualizzato il carattere L);

Se invece usavamo le virgolette singole:

  • Nessuna variabile viene espansa;
  • Sequenze escape dei caratteri ridotta a:
    • \ Visualizza la barra rovesciata;
    • Visualizza la virgoletta singola;

Proviamo quindi a verificare ciò modificando l’esempio precedente:

  1. < ?php
  2. $nome='Daniele';
  3. $cognome='Simonin';
  4.  
  5. echo 'Nome:$nome<br/>Cognome:$cognome';
  6. /*
  7. Nome:$nome
  8. Cognome:$cognome
  9. */
  10. ?>

Come possiamo notare le variabili non vengono espanse ma scritte così come sono, ciò rende questa modalità più veloce di quella a virgolette doppie (ovviamente nel caso in cui non dobbiamo espandere alcuna variabile).

Ora esaminiamo un altro piccolo esempio:

  1. < ?php
  2. $uno='uno';
  3.  
  4. echo "Se voglio che venga fuori "unodue" non scrivo $unodue
  5. ma ${uno}due";
  6. ?>

Se eseguite questo script riceverete un errore che dice “Notice: Undefined variable: unodue in c:… on line 4” perchè PHP è andato alla ricerca della variabile $unodue non facendo ciò che ci aspettavamo (oddio non esageriamo :P).
Per risolvere il problema abbiamo racchiuso il nome della variabile tra le parentesi graffe mettendoci quindi il cuore in pace.
Un altra cosa da notare è come sia possibile suddividere una stringa su più righe magari rendendo il codice più leggibile (verrà comunque visualizzato su un unica riga a meno che non usiate il codice escape corrispondente al ritorno a capo oppure per il web il tag <br/>).
Ma se io ora voglio concatenare più stringhe come faccio?
Non è poi così difficile:

  1. < ?php
  2. $nome='Daniele';
  3. $cognome='Simonin';
  4.  
  5. echo 'Nome completo:'.$nome.' '.$cognome;
  6. echo "Nome completo: $nome $cognome";
  7. /*
  8. Nome completo: Daniele Simonin
  9. Nome completo: Daniele Simonin
  10. */
  11. ?>

Come noterete l’output è uguale in tutti i due casi, con la sola differenza che nel primo metodo abbiamo usato l’operatore punto per unire le stringhe.

Print()

Il costrutto print() si comporta in maniera molto simile a quella dell’echo() tant’è vero che molte persone li considerano uguali, però ci sono delle differenze minimali quali:

  • Print() ha un comportamento simile a quello di una funzione, infatti restituisce sempre 1;
  • Echo() risulta leggermente più veloce del print() (si dice da un 3% al 4%) probabilmente dovuto al fatto che non restituisce alcun valore;

Soprattutto l’ultimo motivo porta molte persone a utilizzare l’echo().

Stringhe heredoc

Come sappiamo il costrutto echo() (o print()) stampa delle stringhe che PHP permette di identificare usando anche la sintassi heredoc.
Per delimitare le stringhe useremo “<<<” seguito da un identificatore per poi chiudere la stringa con lo stesso identificatore seguito da un punto e virgola “;” (che deve essere presente nella prima colonna della riga).
Ecco un esempio:

  1. < ?php
  2. $nome='Daniele';
  3. $cognome='Simonin';
  4.  
  5. echo <<<dati
  6. Nome: $nome
  7. <br/>
  8. Cognome: $cognome
  9. DATI;
  10. /*
  11. Nome: Daniele
  12. Cognome: Simonin
  13. */
  14. ?>

La stringa heredoc si comporta esattamente come quella con virgolette doppie quindi non c’è alcun motivo particolare per discriminare l’una o l’altra.
Alcuni possono preferire questo tipo di stringhe perchè l’identificatore (se scelto in modo opportuno) permette di capire quasi subito il contenuto della stringa.