2010-02-21 9 views
14

Mi piace la sintassi HEREDOC, ad es. per i casi limite di HTML generato che non meritano di essere inseriti in un modello.HEREDOC che interferisce con il rientro del codice

L'unica cosa che mi infastidisce, tuttavia, è il contenuto, e il marker di chiusura di una stringa heredoc aderisce alla prima colonna. Questo svita i layout di codice nidificati:

class myclass 
{ 

    function __construct() 
     { 
     $a = some_code(); 
     $b = some_more_code(); 
     $x = <<<EOT 

line1 
line2 
line3 
line4 

EOT;  

     $c = even_more_code(); 
     $b = still_more_code(); 
     ... 
     ... 
     ... 

si vede cosa intendo.

Ora questo probabilmente non è risolvibile utilizzando il normale HEREDOC. Qualcuno ha lavorato intorno a questo? Il mio sogno sarebbe avere la sintassi HEREDOC con indentazione automatica. Ma immagino che questo non sia possibile senza scrivere un pre-compilatore per i file sorgente.

Sono corretto?

risposta

11

Questo è un problema che hanno spesso troppo: il codice non è molto frastagliata quando uso heredoc, e mi piace molto heredoc :-(

Un problema "più grande" è quando si seleziona un intero blocco di codice, premi "tab" (o qualsiasi equivalente nel tuo IDE) per indentarlo di più perché hai aggiunto una condizione intorno a esso o qualcosa del genere ... E rompe le stringhe heredoc: devi andare un-indent loro a mano :-(

Purtroppo, non ho mai visto qualsiasi strumento come quello che si sta descrivendo ...


Una soluzione, suppongo, sarebbe quella di mettere la stringa heredoc in un altro file e includerla - l'inclusione come potrebbe essere indentata normalmente; ma significherebbe anche un altro file da caricare, il che renderebbe il codice meno chiaro.

+0

Sì, incluso un altro file porta troppa confusione ... Sto pensando di creare un "pre-compilatore" come LESS per CSS, ma sembra troppo sforzo (e un ulteriore passaggio) per un guadagno troppo basso . Peccato! –

+6

Usare un qualche tipo di "pre-compilatore" significherebbe anche che il codice che scrivi e vedi * (nel tuo IDE/editor) * non è il codice che viene eseguito - e questa sarà fonte di confusione, un giorno o l'altro ... –

+0

Off-topic: suggerisco di usare un editor che abbia capacità di analisi decenti per il codice di auto-indent. I buoni IDE (come PhpStorm) non ti permettono di indentare i tag di chiusura HEREDOC anche quando scrivi in ​​modo esplicito delle schede. – TheOperator

6

FYI, questo non risolve il problema, ma il linguaggio di programmazione Ruby supporta heredocs rientrati.

Si potrebbe voler inviare una richiesta di funzionalità agli sviluppatori PHP e utilizzare i documenti Ruby come esempio per dimostrare che un linguaggio esistente risolve questo problema, quindi perché non anche PHP?

2

Non è possibile identificare heredocs o nowdocs in PHP. Questa è la mia soluzione:

function foo() { 
    $a = 123; 
    $b = 456; 
    $sum = $a + $b; 
    $html = " 
     <div> 
     <h1>sum a, b</h1> 
     Number a is $a, number b is $b<br> 
     a+b equals <b>$sum<b> 
     </div> 
    "; 
    echo $html; 
} 

Questo aggiunge gli spazi per il codice html generato ma se si utilizza mod_pagespeed o simili mods apache, il server rimuoverà tutti gli spazi finanziari inutili.

È possibile utilizzare la stessa tecnica per le query SQL multi-righe:

function bar($sql, $id) { 
    $q= " 
     SELECT 
     name 
     , address 
     , phone 
     FROM users 
     WHERE id = '$id' -- possible mysql inyection 
     LIMIT 1 
    "; 
    $sql->query($q); 
} 

I guadagni di codice in leggibilità. Non ha alcun impatto sulle prestazioni e puoi commentare le query SQL del compex (con # o -)

+2

Lo svantaggio di questo approccio è che le virgolette doppie devono essere sfuggite. – Tag

1

Ho appena scoperto una soluzione alternativa per chiunque si chiedesse ancora come farlo. Indenta la tua prima riga che avvia HEREDOC. La tua seconda linea, che è la prima riga di HEREDOC, non deve avere spazi bianchi, quindi lasciala come una riga vuota. Inizia una nuova riga dopo, indentala e scrivi il tuo codice. Quindi completa l'HEREDOC, di nuovo senza spazio bianco. Visualmente otterrai tutto il tuo rientro del codice tranne il completamento di HEREDOC. Evidenzia + TAB è ancora un problema, ma almeno il codice è più leggibile nei loop di controllo, ecc. Ora.

  $html = <<< HTML     //indented line 
               //leave this line empty 
      <div>        //indented line 
       <div>$variable</div>   //indented line 
      </div>        //indented line 
HTML;           //no white space, not indented 
+1

Ho eseguito il rollback di questa risposta alla revisione 1. Le modifiche apportate da @bgs hanno completamente distrutto l'intero punto che Wes stava cercando di fare. –

0

Ho scritto una funzione che consente di indentare come desiderato. In realtà è una funzione piuttosto semplice. https://github.com/chiedolabs/moon-walk-php

Mi piace perché il mio codice rimane pulito in questo modo.

+0

Posso chiederti di recensire il seguente meta-post, per favore? [Come offrire librerie open source personali?] (Https://meta.stackexchange.com/q/229085) –

+0

Sì, basta leggere @MartijnPieters! – Chiedo

+1

* Con moonwalk: * l'esempio nella pagina GitHub non è corretto. Il tag di chiusura per HEREDOC deve apparire all'inizio della riga, il rientro non è possibile. – TheOperator

Problemi correlati