2009-11-19 25 views
6

Estoy algo confundido acerca de cómo funciona el código siguiente. En mi cabeza, me estoy imaginando que cada bloque php se ejecuta como un todo y se procesa en HTML. El hecho de que el primer bloque esté incompleto con una abrazadera colgante no funciona bien con la forma en que imagino que PHP funcionará. ¿Qué hace el módulo PHP cuando llega a una etiqueta de cierre de PHP? ¿Cómo es que el código dentro de las etiquetas PHP puede afectar la salida del texto plano fuera de las etiquetas PHP, es decir, solo condicionalmente la salida del formulario?PHP condicional seguido de la etiqueta de cierre

Hubiera pensado que para lograr lo siguiente habría tenido que usar una declaración de eco para repetir el formulario de forma condicional.

<html> 
<head></head> 
<body> 

<?php 
/* if the "submit" variable does not exist, the form has not been submitted - display initial page */ 
if (!isset($_POST['submit'])) { 
?> 

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
    Enter your age: <input name="age" size="2"> 
    <input type="submit" name="submit" value="Go"> 
    </form> 

<?php 
    } 
else { 
/* if the "submit" variable exists, the form has been submitted - look for and process form data */ 
    // display result 
    $age = $_POST['age']; 
    if ($age >= 21) { 
     echo 'Come on in, we have alcohol and music awaiting you!'; 
     } 
    else { 
     echo 'You're too young for this club, come back when you're a little older'; 
    } 
} 
?> 

</body> 
</html> 

Respuesta

4

El PHP manual lo explica bastante decentemente:

... cuando PHP golpea las etiquetas de cierre ?>, se empieza a escribir lo que encuentra (a excepción de inmediato de una nueva línea - véase la separación de instrucciones) hasta que golpea otra etiqueta de apertura ... pero para la salida de grandes bloques de texto, la deserción modo de análisis PHP es generalmente más eficiente que enviar todo el texto a través echo() o print() ...

3

Las partes fuera de las etiquetas php se tratan como literales que se generan en esa parte del flujo del programa.

2

Si el condicional falla, se salta al final de las llaves dentro del bloque php. Todo lo demás se considera un literal que va directamente a la página (en lugar de ser considerado código).

0

Los desarrolladores de PHP frecuentemente encuentran el problema con el envío de encabezados y cookies después de enviar la salida al navegador, pero ese problema también puede ocurrir con un resultado no intencional. Si el espacio en blanco se inserta después del final de un bloque de código PHP, eso puede producir un resultado involuntario cuando se incluye ese script PHP.

Fuente: http://phpstarter.net/2009/01/omit-the-php-closing-tag/

3

Piense que a la inversa. El documento completo es PHP, ¿con un implícito? > al principio y < implícita? al final. Entonces usted consigue estas equivalencias:

?>HTML TAGS<? 

se vuelve equivalente a

echo 'HTML TAGS'; 

En otras palabras, cada par invertida de apertura de PHP/cierre apoyos encapsula una declaración de eco.

+1

En realidad, es una mala comprensión meterse en la cabeza. Más como - los datos fuera de las etiquetas php no se evalúan, pero aún forman parte de todas las declaraciones de flujo de control.Tal vez –

+1

lado a otro punto de vista escritor ma guión. Hace 10 años que he creado un entorno de programación PHP-como, y esto es exactamente cómo se implementa el compilador/intérprete. Desde la perspectiva del compilador y escritor, esta es una muy buena comprensión de cómo funcionan las cosas. Los datos se evalúan solo en circunstancias especiales, como comillas dobles. Es realmente desagradable pensar en datos que se evalúan generalmente en lugar de solo en circunstancias especiales. – Killroy

0

+1 respuesta de Bernard.

Usted puede hacer este aspecto menos extraño/roto por el uso de sus estructuras de control de nivel de plantillas como etiquetas bien formadas, por ejemplo .:

<?php if (!isset($_POST['submit'])) { ?> 
    <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>"> 
     <label for="age">Enter your age:</label> 
     <input name="age" id="age"> 
     <input type="submit" name="submit" value="Go"> 
    </form> 
<?php } else { ?> 
    <?php 
     // Read submitted age 
     // 
     $age= intval($_POST['age']); 
    ?> 
    <?php if ($age >= 21) { ?> 
     Come on in, we have alcohol and music awaiting you! 
    <?php } else { ?> 
     You're too young for this club, come back when you're a little older. 
    <?php } ?> 
<?php } ?> 

Nota del htmlspecialchars alrededor del $_SERVER['PHP_SELF']; - esto fue un cross-site -scripting hole en el código de ejemplo. Además, había un problema obvio con los apóstrofes en el último echo.

+0

Personalmente, creemos que el código se vuelve mucho más fácil de leer con las etiquetas cortas habilitados. Esto también permite a este atajo sintáctico: Killroy

+0

Sí, sólo eso atajo omite la vital 'htmlspecialchars', por lo que no es tan corta en el extremo. Estoy de acuerdo en que las etiquetas cortas son más fáciles de leer, pero parece que están en camino de desaparecer. La idea de trasladar a PHP Instrucciones de procesamiento de XML fue buena, pero, por desgracia, ya que no proporcionan ninguna manera de inyectar valores de atributo que todavía no se puede escribir PHP que también es XML bien formado. Así que, al final, el cambio a PIs de "etiqueta larga" resultó bastante inútil. – bobince

Cuestiones relacionadas