2010-02-21 20 views
14

Me gusta la sintaxis de HEREDOC, p. para casos extremos de HTML generado que no vale la pena poner en una plantilla.HEREDOC interfiriendo con la indentación de código

Lo único que me molesta, sin embargo, es que el contenido y el marcador de cierre de una cadena heredoc se adhieren a la primera columna. Esto daña los diseños de códigos anidados:

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(); 
     ... 
     ... 
     ... 

ya ves lo que quiero decir.

Ahora esto probablemente no se puede solucionar con HEREDOC normal. Alguien ha trabajado en esto? Mi sueño sería tener la sintaxis de HEREDOC con sangría automática. Pero supongo que esto no es posible sin escribir un precompilador para los archivos fuente.

¿Es correcto?

Respuesta

11

eso es un problema que a menudo tienen también: el código no es así sangría cuando uso heredoc, y me gusta mucho heredoc :-(

Un problema "más grande" es cuando se selecciona la totalidad de un bloque de código, presiona "tab" (o cualquier equivalente en tu IDE) para aplicar una sangría más porque agregaste una condición a su alrededor o algo ... Y rompe las cadenas de heredoc: tienes que ir des-sangrándolos a mano :-(

Desafortunadamente, nunca he visto ninguna herramienta como el que usted está describiendo ...


Una solución, supongo, sería poner la cadena heredoc en otro archivo, e incluirlo - el include como podría sangrarse normalmente; pero también significaría un archivo más para cargar, lo que haría que el código sea menos claro.

+0

Yup, incluyendo otro archivo trae demasiada confusión ... Estoy pensando en construir un "precompilador" como LESS para CSS, pero parece demasiado esfuerzo (y un paso adicional) para ganar muy poco . ¡Demasiado! –

+6

Usar algún tipo de "precompilador" también significaría que el código que escribe y ve * (en su IDE/editor) * no es el código que se ejecuta, y esto será fuente de confusiones, un día u otro ... –

+0

Fuera de tema: sugiero usar un editor que tenga buenas capacidades de análisis para el código de auto-sangrado. Los buenos IDEs (como PhpStorm) no permiten que usted sangre las etiquetas de cierre de HEREDOC incluso al escribir pestañas de forma explícita. – TheOperator

6

Para su información, esto no resuelve su problema, pero el lenguaje de programación de Ruby es compatible con indented heredocs.

Es posible que desee enviar una solicitud de función a los desarrolladores de PHP y utilizar los documentos de Ruby como ejemplo para comprobar que un idioma existente resuelve este problema, entonces ¿por qué no también PHP?

2

No puede identificar heredocs o nowdocs en PHP. Esta es mi solución:

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

Esto añade espacios para el código HTML generado pero si se utiliza mod_pagespeed o similares mods Apache, el servidor eliminará todos los espacios innecesarios.

Usted puede utilizar la misma técnica para varias hileras de consultas SQL:

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

Las ganancias de código de legibilidad. No tiene ningún impacto en el rendimiento y puede comentar consultas compex SQL (con # o -)

+2

La desventaja de este enfoque es que se deben escapar las comillas dobles. – Tag

1

Acabo de descubrir una solución extraña para cualquiera que todavía se pregunte cómo hacerlo. Sangra tu primera línea que inicia el HEREDOC. Su segunda línea, que es la primera línea de HEREDOC, no debe tener espacios en blanco, así que déjelo como una línea en blanco. Comience una nueva línea después de eso, sangría y escriba su código. Luego completa HEREDOC, nuevamente sin espacio en blanco. Visualmente, obtendrá la sangría de todo el código, excepto la finalización del HEREDOC. Resaltar + TAB sigue siendo un problema, pero al menos el código es más legible dentro de los bucles de control, etc., ahora.

  $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

Revertí esta respuesta a la revisión 1. Las ediciones hechas por @bgs destruyeron por completo todo el punto que Wes intentaba hacer. –

0

Escribí una función que le permite sangrar como lo desea. En realidad es una función bastante simple. https://github.com/chiedolabs/moon-walk-php

Me gusta porque mi código se mantiene limpio de esta manera.

+0

¿Puedo pedirle que revise la siguiente publicación meta, por favor? [¿Cómo ofrecer bibliotecas personales de código abierto?] (Https://meta.stackexchange.com/q/229085) –

+0

¡Sí, acaba de leer @MartijnPieters! – Chiedo

+1

El * Con moonwalk: * ejemplo en su página GitHub está mal formado. La etiqueta de cierre para HEREDOC debe aparecer al comienzo de la línea, la sangría no es posible. – TheOperator

Cuestiones relacionadas