vistas una tablas rendimiento recomendaciones queries porque optimizador lenta las daƱan cuello consulta consejos como botella agilizar php html formatting

una - Manteniendo mi PHP bonita



view lenta mysql (14)

Estoy creando un sitio en el que diferentes páginas pueden verse muy diferentes dependiendo de ciertas condiciones (es decir, haber iniciado sesión o no, completar o no el formulario, etc.). Esto hace que sea necesario generar diferentes bloques de html en diferentes momentos.

Hacer eso, sin embargo, hace que mi código php se vea horrible ... realmente se mete con el formato y la "forma" del código. ¿Cómo debería evitar esto? ¿Incluyendo funciones personalizadas de "descarga html" en la parte inferior de mis scripts? Lo mismo, pero con incluye? Heredocs (no se ven muy bien)?

¡Gracias!


Hacer eso, sin embargo, hace que mi código php se vea horrible ... realmente se mete con el formato y la "forma" del código. ¿Cómo debería evitar esto?

Trate su PHP y HTML como una sola jerarquía, con una única estructura de sangría consistente. Entonces, una estructura adjunta de PHP, como ''si'' o ''para'', introduce un nuevo nivel de sangría, y sus contenidos son siempre un conjunto equilibrado de etiquetas de inicio y final. Básicamente está haciendo que su PHP esté "bien formado" en el sentido XML del término, ya sea que esté usando XHTML o no.

Ejemplo:

<div class="prettybox"> Hello <?php echo(htmlspecialchars($name)) ?>! Your food: <?php foreach($foods as $food) { ?> <a href="/food.php?food=<?php echo(urlencode($food)) ?>"> <?php echo(htmlspecialchars($food)) ?> </a> <?php } ?> <?php if (count($foods)==0) { ?> (no food today) <?php } ?> </div>

Tenga cuidado con el dogma religioso que separa la lógica de la separación y el marcado que vuelve a aparecer en las respuestas aquí de nuevo. Si bien es cierto que desea mantener su lógica comercial fuera del código de salida de su página, esto no necesariamente significa que una carga de sobrecarga por el uso de archivos, clases, plantillas y marcos separados es realmente necesaria para lo que está haciendo. Para una aplicación simple, es probable que baste con poner las cosas de acción / lógica en la parte superior del archivo y la salida de la página a continuación.

(Por ejemplo, a partir de uno de los comentarios anteriores, hacer htmlspecialchars () es una funcionalidad de salida de página que definitivamente no desea poner en el bit de acción de su PHP, mezclado en toda la lógica de negocios. Mantenga siempre el texto como simple, sin guardar cadenas hasta el momento en que deja la lógica de la aplicación. Si escribe ''echo (htmlspecialchars (...))'' todo el tiempo es demasiado prolijo, siempre puede hacer una función con un nombre corto como ''h'' que haga lo mismo. )


Creo que tiene dos opciones aquí, use un MVC Framework o use el método de plantillas perezoso que supondría una sobrecarga significativa en su código. Obviamente estoy con el primero, creo que aprender MVC es uno de los mejores trucos de desarrollo web del libro.


En casos como ese, escribo todo de forma incremental en una variable o, a veces, en una matriz y luego hago eco de la variable / matriz. Tiene la ventaja adicional de que la página siempre se procesa de una vez, en lugar de progresivamente.


En lugar de implementar sistemas de plantillas sobre un sistema de plantillas (PHP mismo), creando gastos generales por defecto, puede optar por una solución más robusta como Transformaciones XSL , que también cumple con los Principios MVC (siempre que separe su recuperación de datos; Además, personalmente dividí la lógica de mostrar el XML con diferentes archivos).

Imagine tener la siguiente información en una matriz, que desea mostrar en una tabla.

Array { [car] => green [bike] => red }

Puede crear fácilmente un script que genere esta información en XML:

echo "<VEHICLES>/n"; foreach(array_keys($aVehicles) as $sVehicle) echo "/t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>/n"; echo "</VEHICLES>/n";

Como resultado, en el siguiente XML:

<VEHICLES> <VEHICLE> <NAME>car</NAME> <COLOR>green</COLOR> </VEHICLE> <VEHICLE> <NAME>bike</NAME> <COLOR>red</COLOR> </VEHICLE> </VEHICLES>

Ahora todo esto es excelente, pero eso no se mostrará en un buen formato. Aquí es donde entra XSLT. Con un código simple, puede transformar esto en una tabla:

<xsl:template match="VEHICLES"> <TABLE> <xsl:apply-templates select="VEHICLE"> </TABLE> </xsl:template> <xsl:template match="VEHICLE"> <TR> <TD><xsl:value-of select="NAME"></TD> <TD><xsl:value-of select="COLOR"></TD> </TR> </xsl:template>

Et voila, tienes:

<TABLE> <TR> <TD>car</TD> <TD>green</TD> </TR> <TR> <TD>bike</TD> <TD>red</TD> </TR> </TABLE>

Ahora, para este simple ejemplo, esto es un poco exagerado; pero para estructuras complejas en proyectos grandes, esta es una manera absoluta de mantener su lógica de scripting lejos de su marcado.


Intente separar su contenido y diseño de su código tanto como sea posible. Cada vez que escriba cualquier código HTML en un archivo .php, deténgase y piense "¿Esto realmente pertenece aquí?"

Una solución es usar plantillas. Mira el sistema de plantillas Smarty para una opción bastante fácil de usar.


Lo que termino haciendo en esta situación es crear archivos de "plantilla" de datos HTML que incluyo, y luego analizarlos con expresiones regulares. Mantiene el código limpio y facilita la entrega de piezas a un diseñador u otra persona HTML.

Echa un vistazo a los ideales detrás de las prácticas de programación de MVC en Wikipedia


Necesitas un marco. Esto no solo hará que su código sea bonito (debido al ya mencionado patrón modelo-vista-controlador, MVC), sino que le ahorrará tiempo debido a los componentes que ya están escritos para él.

Recomiendo QCodo, es increíble; hay otros: CakePHP, Symfony.


Por el sonido de su problema, parece que no tiene mucha separación entre la lógica y la presentación en su código. Al diseñar una aplicación, esta es una consideración muy importante, por razones exactamente demostradas por la situación que enfrenta actualmente.

Si no lo has hecho, echaré un vistazo a algunos motores de plantillas de PHP como Smarty .


Si se trata de un gran proyecto, un marco podría estar en orden. De lo contrario, cree algunos archivos de plantilla y en la parte superior de la página decida qué archivo de plantilla incluir.

por ejemplo

if ($_SESSION[''logged_in'']) include(TPL_DIR . ''main_logged_in.tpl''); else include(tPL_DIR . ''main.tpl'');

solo un simple ejemplo


Sugiero fuertemente a sabio en lugar de sabelotodo,

  • no es necesario aprender un nuevo "lenguaje" de plantillas para crear plantillas, las plantillas de sabios se escriben en php
  • si no quiere usar php, puede definir su propia plantilla de "lenguaje" con un compilador
  • es fácilmente extensible por sus propios objetos php

Separar la lógica de la presentación no significa que toda la lógica de negocios tiene que ser en php y la lógica de presentación en otra cosa, la separación es algo conceptual, debe separar la lógica que prepara los datos de la que lo muestra. Obviamente, la lógica de negocios no tiene que contener elementos de presentación.


Use un enfoque de mvc.

http://www.phpmvc.net/

Esto no es algo que retomará en un par de horas. Realmente necesitas practicarlo. Lo principal es que el controlador acceda a su modelo (la capa db), haga cosas con sus datos y luego envíelas a la vista para su renderizado. Esto se simplifica demasiado, pero solo necesita leerlo y practicarlo para comprenderlo.

Esto es algo que solía ayudarme a aprenderlo. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html


como se mencionó anteriormente ... estás arreglando el síntoma, no el problema ...

Lo que necesitas es la separación de la lógica y la presentación. Que se puede hacer con algún tipo de marco mvc. Incluso si no quieres llegar al final con un framework de mvc. Un motor de plantillas es imprescindible al menos si tu lógica es lo suficientemente complicada como para que tengas problemas con lo que estás explicando.


No se asuste, cada nuevo programador web enfrenta este problema.

TIENE QUE separar la lógica de su programa de su pantalla. Primero, intente hacer su propia solución usando dos archivos para cada página web:

  • uno con solo código PHP (sin HTML) que llena variables
  • otro con HTML y muy pocos PHP: este es el diseño de tu página

Luego incluye dónde / cuando lo necesites. P.EJ :

myPageLogic.php

<?php // pure PHP code, no HTML $name = htmlspecialchars($_GET[''name'']); $age = date(''Y'') - htmlspecialchars($_GET[''age'']); ?>

myPageView.php

// very few php code // just enought to print variables // and some if / else, or foreach to manage the data stream <h1>Hello, <?php $name ?> !</h1> <p>So your are <?php $age?>, hu ?</p>

(Puede usar la sintaxis alternativa de PHP para este. Pero no intente forzarlo para que sea perfecto la primera vez, realmente).

myPage.php

<?php require(''myPageLogic.php''); require(''myPageView.php''); ?>

No se preocupe por los problemas de rendimiento por ahora . Esta no es tu prioridad como novato. Esta solución es imperfecta, pero te ayudará a resolver el problema con tu nivel de programación y te enseñará los conceptos básicos.

Luego, una vez que se sienta cómodo con este concepto, compre un libro sobre el patrón MVC (o busque las entradas de desbordamiento de pila al respecto). Eso es lo que quieres hacer la PRÓXIMA VEZ . Luego, probará algunos sistemas y marcos de plantillas, pero MÁS TARDE . Por ahora, solo codifica y aprende desde el principio. Puedes codificar perfectamente un proyecto como ese, como novato, está bien.


Consulte esta pregunta sobre la separación de PHP y HTML, hay varias formas de hacerlo, incluidos sistemas de plantillas autocritas, sistemas de plantillas como Smarty, PHP como sistema de plantillas, etc. etc., etc.