Qual è il vantaggio dell'utilizzo di heredoc in PHP? [chiuso]


196

Qual è il vantaggio dell'utilizzo di heredoc in PHP e puoi mostrare un esempio?


4
Non vi è alcun motivo per cui i sostituti siano migliori degli heredocs
Shakti Singh,

18
L'ho modificato in modo da renderlo più costruttivo e ho reso la wiki della comunità delle domande molto soggettiva. Nota, la community potrebbe ancora chiudere questo, ho scelto di lasciarlo aperto perché stai ottenendo risposte di qualità.
Tim Post

9
Perché esattamente questa domanda non è considerata costruttiva?
Ambo100,

Risposte:


218

La sintassi ereditaria per me è molto più pulita ed è davvero utile per le stringhe multilinea ed evitare problemi di quotazione. Ai tempi li usavo per costruire query SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Per me questo ha una probabilità inferiore di introdurre un errore di sintassi rispetto all'utilizzo delle virgolette:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Un altro punto è evitare di sfuggire alle doppie virgolette nella stringa:

$x = "The point of the \"argument" was to illustrate the use of here documents";

Il pProblem con quanto sopra è l'errore di sintassi (la citazione con escape mancante) che ho appena introdotto in contrapposizione alla sintassi del documento qui:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

È un po 'di stile, ma uso le seguenti regole per i documenti singoli, doppi e qui per la definizione delle stringhe:

  • Le virgolette singole vengono utilizzate quando la stringa è come una costante'no variables here'
  • Virgolette doppie quando posso mettere la stringa su una singola riga e richiedere l'interpolazione variabile o una virgoletta singola incorporata"Today is ${user}'s birthday"
  • Qui documenti per stringhe multilinea che richiedono formattazione e interpolazione variabile.

40
Nitpick sul tuo esempio SQL: in primo luogo non dovresti usare virgolette doppie. Funziona solo con MySQL e solo quando quel server non funziona in --ansimodalità conforme. Le stringhe SQL devono utilizzare virgolette singole.
mario,

17
@mario Era per l'illustrazione del problema con l'uso delle doppie virgolette in generale, non per le specifiche del sql
Wes,

4
Per non dire che inserire direttamente le variabili in una query è una cattiva, cattiva educazione :-P
Il tuo senso comune

5
@Wes e @mario Questo è ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths

11
"Per non dire che inserire direttamente le variabili in una query è una cattiva, cattiva educazione". Questo non è affatto vero. Inserire input non validati in istruzioni SQL è "cattive maniere". A volte è necessario inserire variabili all'interno delle istruzioni SQL.
vogomatix,

67

Gli heredoc sono un'ottima alternativa alle stringhe tra virgolette a causa della maggiore leggibilità e manutenibilità. Non è necessario sfuggire alle virgolette e (buoni) IDE o editor di testo utilizzeranno l'evidenziazione della sintassi corretta.

Un esempio molto comune: riecheggiare HTML dall'interno di PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

È facile da leggere e da mantenere.

L'alternativa è l'eco delle stringhe tra virgolette, che alla fine contengono virgolette sfuggite e gli IDE non metteranno in evidenza la sintassi di quella lingua, il che porta a una scarsa leggibilità e a maggiori difficoltà di manutenzione.

Risposta aggiornata per il tuo senso comune

Ovviamente non vorrai vedere una query SQL evidenziata come HTML. Per usare altre lingue, basta cambiare la lingua nella sintassi:

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
Conosci la funzione " fuga da PHP " di PHP ?
Il tuo senso comune

5
L'evasione da PHP a volte va bene, ma quando fai eco a molte cose, la tua sintassi evidenzia interruzioni, devi digitare più caratteri semplicemente sfuggendo da PHP e PHP ha più comandi da eseguire invece di una singola eco. Inoltre, puoi impostare una stringa Heredoc su una variabile e riecheggiarla in seguito. L'escape di PHP per il tuo HTML significa che viene stampato allora e lì. Non è possibile salvarlo per dopo.
Jake Wilson,

2
1. è possibile utilizzare il buffering dell'output per salvare l'output. 2. Stavi usando l'eco nel tuo primo esempio. 3. (buoni) IDE o editor di testo non interrompono MAI l' evidenziazione HTML quando si utilizza l'escaping da PHP. 4. Quale IDE evidenzia la sintassi per HEREDOC e quali regole linguistiche vengono utilizzate? Va bene vedere una query SQL evidenziata come testo HTML?
Il tuo senso comune

1
Un Heredoc è una stringa PHP. Ovviamente non puoi usare le strutture di controllo in una stringa. php.net/manual/en/language.types.string.php
Jake Wilson

11
Penso che fraintendiate che Heredoc si applichi solo alle stringhe di HTML. Gli Heredoc sono semplicemente un modo alternativo di definire una stringa, che si tratti di HTML o di una query SQL o di qualsiasi cosa tu voglia. Sono più facili da scrivere e mantenere, la risposta di Wes sopra mostra che ovviamente (che se noti ha il corretto evidenziazione della sintassi. Non lamentarti per il fallimento di NetBeans). Non sono sicuro del motivo per cui sembri così deciso a votare in basso una risposta su una domanda della wiki della community ... Che ci crediate o no, gli sviluppatori PHP originali potrebbero aver incluso Heredoc in PHP perché in alcuni casi potrebbe essere utile. .
Jake Wilson

8

Alcuni IDE evidenziano automaticamente il codice nelle stringhe heredoc, il che rende visivamente attraente l'utilizzo di heredoc per XML o HTML.

Personalmente mi piace per parti più lunghe di XML, dal momento che non mi devo preoccupare di citare i caratteri di citazione e posso semplicemente incollare l'XML.


6

Prima di tutto, tutte le ragioni sono soggettive. È più una questione di gusti piuttosto che una ragione.

Personalmente, trovo heredoc abbastanza inutile e lo uso occasionalmente, il più delle volte quando ho bisogno di inserire un po 'di HTML in una variabile e non voglio preoccuparmi del buffering dell'output, per esempio per formare un messaggio di posta elettronica HTML.

La formattazione non si adatta alle regole generali di rientro, ma non credo sia un grosso problema.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

Per quanto riguarda gli esempi nella risposta accettata, è semplicemente barare.
Gli esempi di stringhe, in effetti, sono più concisi se non ci si tradisce

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';

3

Non so se direi che l'ereditarietà è pigrizia. Si può dire che fare qualsiasi cosa sia pigrizia, poiché ci sono sempre modi più ingombranti per fare qualsiasi cosa.

Ad esempio, in alcune situazioni potresti voler generare del testo, con variabili incorporate senza dover recuperare da un file ed eseguire una sostituzione del modello. Heredoc ti consente di rinunciare a dover evitare le virgolette, quindi il testo che vedi è il testo che hai prodotto. Chiaramente ci sono alcuni aspetti negativi, ad esempio, non puoi indentare la tua eredità, e ciò può diventare frustrante in determinate situazioni, specialmente se sei un pignolo per la sintassi unificata, che io sono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.