una - pasar variable php a html
¿Cómo salir del bloque de código PHP? (7)
En PHP, ¿es posible salir de un bloque de código PHP (es decir, las etiquetas PHP)?
<?php
if (!A) phpexit();
print("1");
?>
<?php
print("2");
?>
Entonces, si A
era verdadero, entonces el resultado es 12
, y si A
era falso, entonces el resultado es 2
.
Sé que puedes hacer esto con una sentencia if o algo así, pero quiero saber si también hay alguna función especial de PHP que pueda hacer esto.
Hay un operador de goto
, pero le recomiendo encarecidamente que no utilice este tipo de trucos ("código de espagueti"). Es mejor que uses bloques estructurados, no hay nada de malo en ellos.
Antes de usar goto
, considere soluciones alternativas : por ejemplo, puede include
diferentes scripts dependiendo de la condición A
Me he encontrado en varias situaciones en las que el resto de un bloque de código PHP debe omitirse debido a una condición de error (error de conexión de la base de datos, entrada no válida, etc.). Como estudiante, mi profesor simplemente usa die
, que detiene el análisis del archivo por completo, dejando la página incompleta, sin el pie de página o incluso las etiquetas de cierre HTML </body></html>
. Incluso cuando hay un error, no hay razón para generar HTML no válido al cortar las etiquetas de cierre.
Por supuesto, un enfoque puramente estructurado usaría las sentencias if
, y esto es preferible a goto
en la gran mayoría de las situaciones. Sin embargo, siento que si solo intentas saltar de un bloque de código PHP, colocar grandes segmentos de código en una estructura if
/ else
es bastante poco elegante y puede hacer que el código sea más difícil de entender que simplemente usar una instrucción goto
que salta al final del bloque de PHP, justo antes de ?>
, ya que es difícil recordar que un montón de código es, de hecho, parte de una declaración condicional 50+ líneas debajo de las líneas if
o elseif
.
Todos dicen que las declaraciones goto
son malas, pero existen usos válidos para hacer que el código sea más fácil de entender, como saltar de estructuras de control profundamente anidadas y saltar al final de un bloque de código PHP (dado que no hay lenguaje incorporado existe construcción para hacer eso).
Una construcción de código como goto
no es inherentemente mala. Se trata de cómo lo usas.
No, no hay ninguno. Pero lo que podría hacer es poner una etiqueta al final de cada bloque y luego usar goto
(no recomendado, pero cuando no quiera un gran if
...) (ps: vea la respuesta de @ gd1 como una sugerencia aquí; -PAG)).
<?php
if (!A) goto exit_1;
print("1");
exit_1: ;
?>
<?php
print("2");
exit_2: ;
?>
No, y no tendría sentido. Imagina que puedes hacer esto y tienes este código:
<?php
if (!A) phpexit();
if (B) {
?>
<b>Foo</b>
<?php
}
?>
<i>Baz</i>
¿A dónde phpexit()
? El bloque then
del if (B)
salta y entra de un bloque PHP, pero no quiere saltar a <b>Foo</b>
desde if (!A)
, ¿verdad? No tendría sentido saltar dentro de un bloque sin verificar la condición.
Como gd1 ya mostró , podrías hacer esto con goto
pero eso haría que tu código no estuviera estructurado. Te harías muy difícil a ti mismo (y a los futuros mantenedores de tu código) comprender el flujo de tu código cuando tu código salta por todas partes.
En los lenguajes de bajo nivel (es decir, ensamblaje) solo tiene que trabajar con saltos, pero en los idiomas superiores los abstrae con estructuras como if
, for
y while
. Estos proporcionan una estructura que le impide intencionalmente saltar a cualquier lugar que desee.
Podría haber dos soluciones:
1) menos hacky
Incluye el código que tienes en el bloque en archivos separados. Puede usar el return
en ellos para detener el procesamiento del archivo incluido.
//file1.php
if (!A) return;
print("1");
// file2.php
print("2");
<?php include "file1.php";?>
<?php include "file2.php";?>
2) más hacky (otros probablemente me maten)
Ponga el bloque en do { ... } while(false);
Bloquear y romper con eso
<?php do {
if (!A) break;
print("1");
} while(false); ?>
<?php do {
print("2");
} while(false); ?>
Si esto es para algo más que un experimento, lo estás haciendo mal . Deja de hacer la programación orientada a incluir como empezar a aprender OOP.
Bueno ... siempre se podría ajustar el contenido <?php ?>
En una función anónima;
<?php $f = function () use (&$a) {
if ($a)
{
echo 1;
return;
}
echo 2;
};$f(); ?>
<?php $f = function () {
echo 2;
};$f(); ?>
Esto funcionaría en PHP 5.3+. Y si necesita compartir una variable, puede inyectarla en el ámbito con la instrucción use()
en la definición.
Pero déjame repetir:
Si quieres hacer algo como esto en código de producción, lo estás haciendo mal.
Si respetas demasiado la cultura geek pop y sientes que necesitas encajar (¡y hacerte popular!), Aquí hay una solución sin goto
:
<?php
call_user_func(function() {
if (!A) return;
print("1");
});
?>
<?php
print("2");
?>