Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    [PILLOLA] Apici, virgolette e heredoc: come ottimizzare le stringhe in PHP.

    Le stringhe sono un tipo di dati fondamentale in un linguaggio di programmazione, lo sono ancora di più in PHP, dato che ci vengono consentite operazioni non possibili in altri linguaggi, come ad esempio l'espansione delle variabili al loro interno.

    Molti (spesso neofiti del PHP) sono all'oscuro di alcune peculiarità delle stringhe, e per questo è importante conoscerle bene per sfruttare tutte le potenzialità fornite, evitando di ottenere i classici errori 'parse error'.

    Iniziamo col dire che ci sono ben tre diversi modi per delimitare una stringa:

    - con apici singoli (')
    - con apici doppi (")
    - utilizzando la sintassi heredoc

    Racchiudere una stringa tra apici singoli è il metodo più semplice, ma anche il meno 'efficiente'.
    Una sola particolarità: se serve inserire al suo interno un ulteriore apice (') oppure una backslash (\) basta anteporre la classica backslash di escape (\).

    Lo scenario cambia se noi racchiudiamo la nostra stringa con doppi apici (").
    La caratteristica più importante è che ora possiamo inserire all'interno della stringa le nostre variabili PHP, che verranno automaticamente espanse nel momento in cui la stringa verrà utilizzata.
    Facciamo un esempio:

    codice:
    $oggi = strftime('%A, %d-%B-%Y',mktime());
    echo "Oggi è $oggi";
    visualizzerà: 'Oggi è Saturday, 04-January-2003'

    Possiamo anche inserire un array, ma dobbiamo fare attenzione: se utilizziamo un indice numerico tutto bene, mentre se l'array è associativo bisogna togliere gli apici;
    Ad esempio:

    codice:
    $hash=array("Ferrari"=>"rossa","Jordan"=>"gialla","Renault"=>"azzurra");
    echo "La Ferrari è $hash[Ferrari]"; // questo genera errore: $hash["Ferrari"]
    visualizzerà: 'La Ferrari è rossa'

    A dire il vero è possibile anche mantenere gli apici, utilizzando però una sintassi diversa, chiamata 'complex sintax' non perchè sia difficile, ma perchè riesce a risolvere casi più complessi, come vedremo adesso.

    Se avessi inserito un array multidimensionale nell'esempio precedente, non avrei ottenuto un errore PHP, avrei semplicemente ottenuto un valore simile: 'Array[2]'
    questo perchè per risolvere un array multidimensionale bisogna passare alla 'sintassi complessa' che prevede l'utilizzo di una coppia di graffe {} che racchiudono l'elemento da elaborare.
    Esempio:

    codice:
    $multi=array(array("Ferrari","Jordan","Renault"),array("rossa","gialla","azzurra"));
    echo "La {$multi[0][1]} è {$multi[1][1]}";
    visualizzerà: 'La Jordan è gialla'

    E' importante notare che dopo la parentesi graffa di apertura non deve esserci alcuno spazio, altrimenti non otterremo il risultato voluto.

    Le parentesi graffe ci consentono anche di utilizzare, all'interno di una stringa, le proprietà e le funzioni di un oggetto;
    vediamo un esempio:

    codice:
    class macchina {
      var $nome;
      var $colore;
    
      function macchina() {
        $this->nome = 'Ferrari';
        $this->colore = array('rossa', 'gialla', 'azzurra');
      }
    }
    
    $ferrari = new macchina();
    echo "La {$ferrari->nome} è {$ferrari->colore[0]}";
    visualizzerà: 'La Ferrari è rossa'

    La stringa delimitata da apici doppi ci consente inoltre di inserire al suo interno degli apici singoli, che possiamo utilizzare ad esempio nella scrittura di codice HTML:

    codice:
    $html="[img]../images/img.gif[/img]";
    echo "$html";
    ma se ci serve un'ulteriore annidamento di apici, allora dobbiamo ricorrere all'escape del doppio apice (\") come nell'esempio:

    codice:
    $html="[img]../images/img.gif[/img]";
    echo "$html";
    L'ultimo delimitatore di stringa prevede la sintassi heredoc.
    Questa sintassi esclude gli apici come delimitatori che vengono quindi recuperati e sfruttati per ulteriori annidamenti (e questo è sicuramente un vantaggio) ed utilizza un delimitatore iniziale: <<<END e un delimitatore finale: END;
    Importante notare che:
    - END può essere sostituito liberamente da qualsiasi serie di caratteri alfanumerici e underscore, ma il primo carattere deve essere letterale.
    - il delimitatore finale deve essere posto necessariamente all'inizio della riga, e non devono esserci spazi prima o dopo il punto e virgola.

    Nel caso di stringhe di un certo 'peso', la sintassi heredoc è sicuramente il migliore delimitatore di stringa disponibile per i seguenti motivi:
    - sfrutta tutte le peculiarità della delimitazione con apici doppi, sopra descritte, pur non utilizzando gli apici
    - è l'ideale per la stesura di grossi blocchi di codice html o javascript (da inviare poi con un unico comando 'echo') pur mantenendo un certo 'ordine' di codifica.

    codice:
    $multi=array(array('Ferrari','Jordan','Renault'),array("rossa","gialla","azzurra"));
    echo <<<END
    <table border="1" width="100%">
      <tr>
        <td>{$multi[0][0]}</td>
        <td>{$multi[1][0]}</td>
      </tr>
      <tr>
        <td>{$multi[0][1]}</td>
        <td>{$multi[1][1]}</td>
      </tr>
      <tr>
        <td>{$multi[0][2]}</td>
        <td>{$multi[1][2]}</td>
      </tr>
    </table>
    END;
    E questo per il momento è tutto.
    Ulteriori informazioni sulle stringhe possono essere trovate nel manuale PHP al capitolo 7 (Type/String).

    Nella speranza di esservi stato utile, ne approfitto per augurare a tutti un Buon Anno 2003.


  2. #2
    Molto utile e chiaro, complimenti!
    Fra le altre cose sono riuscito a risolvere un problema che nn capivo e adesso ho anche capito cosa sbagliavo
    Bye
    Conquista la folla, e conquisterai la libertà (Proximus - Il gladiatore)
    Il riferimento italiano per i Fans di Final Fantasy
    Scandalos member of APE

  3. #3
    Mi fa piacere

    Ne approfitto per integrare il discorso:

    analizzate questa situazione:

    codice:
    $colore="rossa";
    echo "La Ferrari Testa$colore3000";
    Il risultato sarà: 'La Ferrari Testa '
    perchè la variabile $colore è 'attaccata' al testo '3000'

    ma sei modifico il codice così:
    codice:
    $colore="rossa";
    echo "La Ferrari Testa${colore}3000";
    la variabile $colore viene espansa correttamente e ottengo:
    'La Ferrari Testarossa3000'

    bye

  4. #4
    Pillola aggiunta al thread in rilievo !
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

  5. #5
    decisamente molto utile

    grande gianfry

    Alessandro, l'unico pinguino con le scarpe da ginnastica

    PhpItalia.net - il portale definitivo sul PHP

  6. #6
    Utente di HTML.it L'avatar di smt
    Registrato dal
    Jul 2002
    Messaggi
    167
    hai fatto bene ad approfondire un argomento che a volte viene dato per scontato.
    Reality is that which, when you stop believing in it, doesn't go away

  7. #7
    già, lo davo per scontato anch'io.... poi mi sono andato a leggere bene cosa diceva il manuale php riguardo alle stringhe, e ho scoperto tante cosine nuove che ho sintetizzato in questa pillola

    quel manuale è veramente un pozzo senza fine
    peccato che non c'è mai il tempo di leggerlo in modo approfondito


  8. #8
    un appunto però:

    quando dobbiamo usare stringhe che non contengono variabili è + efficiente usare i singoli apici.. questo perchè il motore PHP sa a priori che non dovrà cercare variabili da interpretare e quindi non perderà tempo a fare il parsing della stringa.

    E' una minuzia, ma io sono pignolo

  9. #9
    ...inoltre con le stringhe a apici singoli non potremo usare i caratteri tipo "\r\n" per andare a capo, perchè ce li restituisce così come li abbiamo scritti...

    Per usarli servono stringhe a doppi apici, altrimenti usare la funzione chr() (+ comoda...).

    ciao,
    jack.

  10. #10
    Originariamente inviato da mdsjack
    ...inoltre con le stringhe a apici singoli non potremo usare i caratteri tipo "\r\n" per andare a capo, perchè ce li restituisce così come li abbiamo scritti...

    Per usarli servono stringhe a doppi apici, altrimenti usare la funzione chr() (+ comoda...).

    ciao,
    jack.
    o un semplice

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.