2010-02-02 13 views
13

Recentemente ho guardato il mio codice sorgente ed è stato un vero casino.Posso eseguire l'override della funzione integrata di PHP echo()?

mia fonte php:

echo '<h1>Rar<h1>'; 
echo '<span>Rar</span>'; 
echo '<p>Rar</p>'; 

e quando ho vista la sorgente del browser per la pagina visualizzata:

<h1>Rar</h1><span>Rar</span><p>Rar</p> 

c'è un modo per me di ignorare eco in modo che ogni uscita sarebbe finita con una nuova riga, qualcosa come

function echo($string) 
{ 
echo $string . "\r\n"; 
} 
+2

e quando * non * desidera una nuova riga? cosa faresti allora? – grapefrukt

+0

"e quando non vuoi una nuova riga?" --- Usa stampa? – PurplePilot

+0

Correlati: http://stackoverflow.com/questions/948682/how-to-keep-php-view-source-html-output-clean/ – soulmerge

risposta

9

echo non è una funzione, ma una lingua dichiarazione. Non può essere ridefinito. Se stai cercando di migliorare il tuo output markup, dai un'occhiata a Tidy.


Quello che si poteva fare, è usare ricerca del IDE/metodo di sostituire e sostituire tutte le echo dichiarazioni con echo PHP_EOL,. Ciò aggiungerebbe i caratteri di nuova riga del sistema operativo prima di qualsiasi output. Nota la virgola dopo PHP_EOL poiché è importante.

Puoi diversi valori di uscita con l'eco di questo tipo:

echo 'one', $foo, PHP_EOL, 
    'two', $bar, PHP_EOL; 

quindi non c'è bisogno di scrivere echo su ogni riga.

Tuttavia, sono d'accordo con chiunque abbia suggerito di utilizzare un approccio più dedicato per separare contenuto e layout, ad es. utilizzando le viste del modello o HereDoc.

In aggiunta, c'è molto poco guadagno nell'avere una bella annotazione. Se stai usando strumenti come Firebug per ispezionare l'HTML, avrai un markup formattato in modo appropriato a prescindere dal disordine che il markup è realmente. Inoltre, su siti con molti visitatori, troverai spesso il markup miniato, che è l'opposto di quello che stai cercando di fare, semplicemente perché tutte queste nuove righe e schede si aggiungono al peso della pagina, il che porta a rallentare caricamento della pagina e aumento del costo del traffico.

0

Puoi indirettamente sovraccaricare echo() utilizzando il __toString()magic method in questo modo: "Ciao mondo"

<?php 
class CleanOutput 
{ 
    public $content; 

    public function __construct($c) { 
     $this->content= $c; 
    } 

    public function __toString() { 
     return $this->content . '\r\n'; 
    } 
} 

$text= new CleanOutput('Hello world!'); 
echo $text; 
?> 

È possibile che questo sarebbe uscita con una nuova riga e un ritorno a capo aggiunto alla fine. Ci sono modi per incapsulare ulteriormente questo, ma sono al di fuori della portata della mia risposta.

Edit:
Come è stato notato, la soluzione di cui sopra è lento/goffo. Ecco una soluzione più elegante utilizzando output buffering:

<? 
function clean_up($foo) { 
    return $foo . '\r\n'; 
} 
ob_start('clean_up'); 
ob_implicit_flush(true); 
echo "Hello world!"; 
?> 

Questo è più veloce e più pulita (anche se non è così tecnicamente 'esclusione' eco).

+4

Soluzione assolutamente corretta e geniale. Il problema è che l'OP avrebbe bisogno di avvolgere ogni porzione di testo che sta attualmente "echeggiando" in "new CleanOutput()", che manca il punto della domanda. ;-) – deceze

+2

Questo è tremendamente inefficiente; richiede oltre dieci volte il tempo di un eco/stampa equivalente. Inoltre, '\ r \ n' non funzionerà come previsto. Deve essere racchiuso tra virgolette. –

+0

Molto vero (su entrambi i fronti). OP ha chiesto se l'eco può essere sovrascritto. Ho dimostrato che può: P –

3

Hai diverse possibilità di output HTML.

è possibile utilizzare la heredoc sintassi:

$html = <<<EOF 
<h1>Rar<h1> 
<span>Rar</span> 
<p>Rar</p> 
EOF 
echo $hml; 

O (che cosa è il modo migliore a mio parere), HTML separato da PHP. Per esempio. mettere tutta la logica PHP nella parte superiore del file e l'HTML dopo il blocco PHP:

<?php 
    // all your PHP goes here 
    $foo = 'bar' 
?> 
<!-- HTML comes here --> 
<html> 
    <body> 
    <div>Hello <?php echo $foo; ?> </div> 
    </body> 
</html> 

variabili possono essere stampati come mostrato sopra. Ma queste variabili non contengono contengono HTML.

Quando si deve output HTML base a una condizione, è possibile utilizzare il alternative syntax for control statements:

<?php if($some_condition): ?> 
    <h1>Rar<h1> 
    <span>Rar</span> 
    <p>Rar</p> 
<?php endif ?> 

In questo modo è anche più facile da eseguire il debug del codice HTML in quanto non è solo una stringa di PHP.

+0

+1 per la separazione di HTML e PHP –

0

Un'altra soluzione sarebbe quella di separare il codice dai propri layout utilizzando un motore di template adeguato.

+7

... che PHP è già su se stesso. – Gordon

+0

avrai sempre qualche codice php nel tuo layout – Natrium

+0

@Gordon, sono d'accordo. PHP può essere usato come motore di template. Ma non è sempre usato come uno. In quei casi, avere i modelli rende la vita più semplice? @Natrium, non proprio. Adoro il modo in cui è fatto in Google webapp e Django (entrambi i framework Python) e lo stesso può essere ottenuto in PHP usando Smarty o framework simili. – Sri

2

È possibile impostare ed emettere il buffer e quindi eseguire il buffer tramite htmltidy. L'estensione ordinata ha anche a specific function per lo scopo. Basta chiamare questo prima di iniziare l'output tuo html:

ob_start('ob_tidyhandler'); 
1

Anche se questa soluzione non ignorare eco, si può ottenere qualcosa di simile a risuonare con un ritorno a capo. Aggiungere:

function e() { 
    return o::singleton(); 
} 

class o { 
    private static $instance; 

    public static function singleton() 
    { 
     if (!isset(self::$instance)) { 
      $className = __CLASS__; 
      self::$instance = new $className; 
     } 
     return self::$instance; 
    } 

    public function __set($prop, $txt) { 
     echo $txt . PHP_EOL; 
    } 
} 

al file, e quindi è possibile utilizzare:

e()->o = "Line which ends in newline"; 

invece di eco.

Problemi correlati