2010-02-02 11 views
13

Recientemente miré mi código fuente y fue un verdadero desastre.¿Puedo anular la función incorporada de PHP echo()?

mi fuente php:

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

y cuando veo la fuente del navegador para la página representada:

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

hay una manera para mí para anular el eco de manera que cada salida terminaría con una nueva línea, algo así como

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

y cuando * no * quieres una nueva línea? ¿Qué harás entonces? – grapefrukt

+0

"y cuando no quiere una nueva línea?" --- ¿Usar impresión? – PurplePilot

+0

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

Respuesta

9

echo no es una función, sino un lenguaje declaración. No puede ser redefinido. Si está buscando embellecer su marcado de salida, tenga en cuenta Tidy.


Lo que podía hacer, es utilizar la búsqueda de su IDE/replace y reemplazar todas las declaraciones con echoecho PHP_EOL,. Esto agregaría los caracteres de nueva línea específicos del sistema operativo antes de cualquier salida. Tenga en cuenta la coma después de PHP_EOL, ya que es importante.

que pueda introducir varios valores de salida con eco de este tipo:

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

lo que no hay necesidad de escribir echo en cada línea.

Sin embargo,, estoy de acuerdo con cualquiera que sugiriera utilizar un enfoque más dedicado para separar el contenido y el diseño, p. usando vistas de plantilla o HereDoc.

Además, hay muy poca ganancia en tener marcas bonitas. Si está utilizando herramientas como Firebug para inspeccionar el HTML, tendrá marcado correctamente formateado, independientemente del desorden que sea el marcado. Además, en los sitios con muchos visitantes, a menudo encontrará el marcado minimizado, que es lo contrario de lo que está tratando de hacer, simplemente porque todas estas nuevas líneas y pestañas se suman al peso de la página, lo que lleva a un retraso cargas de página y aumento del costo de tráfico.

0

indirectamente Usted puede sobrecargar echo() utilizando el __toString()magic method de este modo: "¡Hola mundo"

<?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; 
?> 

El haría de salida por encima con una nueva línea y un retorno de carro adjunto al final. Hay formas de encapsular esto, pero están fuera del alcance de mi respuesta.

Editar:
Como se señaló, la solución anterior es lento/torpe. Aquí hay una solución más elegante usando output buffering:

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

Esto es más rápido y más limpio (aunque no lo hace técnicamente 'anulación' eco).

+4

Solución absolutamente correcta e ingeniosa. El problema es que el OP debería envolver cada fragmento de texto que está 'copiando' en 'nuevo CleanOutput()', lo cual no tiene sentido. ;-) – deceze

+2

Esto es tremendamente ineficiente; requiere 10 veces más tiempo que un equivalente de eco/impresión. Además, '\ r \ n' no funcionará como se esperaba. Debe estar entre comillas dobles. –

+0

Muy cierto (en ambos casos). OP preguntó si el eco puede ser anulado. Demostré que puede: P –

3

Tiene varias posibilidades para generar HTML.

Usted puede utilizar la sintaxis heredoc:

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

O (lo que es mucho mejor en mi opinión), HTML independiente desde PHP. P.ej. poner toda la lógica de PHP en la parte superior del archivo y el código HTML después de que el bloque de PHP:

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

Las variables se pueden imprimir como se muestra arriba. Pero estas variables no contienen HTML.

Cuando se tiene a la salida HTML basado en una condición, puede utilizar la alternative syntax for control statements:

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

De esta manera también es más fácil para depurar el código HTML, ya que no sólo es una cadena PHP.

+0

+1 para separar HTML y PHP –

0

Otra solución sería separar su código de sus diseños mediante el uso de un motor de plantillas adecuado.

+7

... que PHP ya está en sí mismo. – Gordon

+0

siempre tendrá algún código php en su diseño – Natrium

+0

@Gordon, estoy de acuerdo. PHP se puede utilizar como un motor de plantillas. Pero no siempre se usa como uno. En esos casos, tener plantillas hace la vida más simple? @Natrium, no realmente. Me encanta cómo se hace en Google webapp y Django (ambos frameworks de Python) y lo mismo se puede lograr en PHP usando Smarty o frameworks similares. – Sri

2

Puede configurar y salir del búfer y luego ejecutar el búfer a través de htmltidy. La extensión ordenada incluso tiene a specific function para este propósito. Sólo tiene que llamar esto antes de empezar a dar salida a su html:

ob_start('ob_tidyhandler'); 
1

Aunque esta solución no anula el eco, se puede conseguir algo cerca de eco con un salto de línea. Añadir:

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; 
    } 
} 

a su archivo, y luego se puede utilizar:

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

en lugar de eco.

Cuestiones relacionadas