resueltos - PHP-If/else, for, foreach, while-¿sin llaves?
if php en html (10)
¡Funcionará bien si solo tienes un argumento adentro! Pero si quiere omitir la llave, puede usar dos puntos y un final. ejemplo:
if(a < 1 ) :
echo "a is less than 1";
else :
echo "a is greater than 1";
endif;
Algo que realmente me gustaría saber pero que nunca descubrí son atajos en PHP.
Actualmente estoy codificando una función con un bucle foreach
con solo una declaración dentro. Traté de omitir las llaves como lo puedes hacer en estructuras de control if / else y funciona. Sin errores.
foreach($var as $value)
$arr[] = $value;
Ahora traté de usarlo de la misma manera pero poniendo un bloque if / else dentro de él. De nuevo, funciona y no hay errores.
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
Entonces, pensé "¿por qué está funcionando?" y omitió el punto y coma de cierre. Aún trabajando. Así que traté de usar la instrucción if / else sin llaves dentro del ciclo foreach y de nuevo, aún funcionando y sin errores. Pero, ¿el ciclo foreach realmente está cerrado / terminado ahora?
foreach($var as $value)
if(1 + 1 == 2)
$arr[] = $value;
Al menos omití el punto y coma de nuevo y (como se esperaba) se produjo un error de análisis.
Entonces mi gran pregunta es: ¿cuándo puedo omitir las llaves y en qué estructura / lazo / función? Sé que definitivamente puedo hacerlo en if
y else
. Pero, ¿qué pasa while
, for
y foreach
?
Y sí, sé que no es seguro, inteligente, lo que sea para codificar sin llaves y hay shorthands como $condition ? true : false;
$condition ? true : false;
y if: doSomething(); endif;
if: doSomething(); endif;
endfor;
y endforeach;
. No quiero aprender sobre los shorthands, solo quiero entender las condiciones sobre cuándo y dónde es posible omitir las llaves.
Cuando omite las llaves, solo tratará la siguiente declaración como el cuerpo de la condición.
if ($x) echo ''foo'';
es lo mismo que
if ($x) { echo ''foo''; }
pero recuerda eso
if ($x)
echo ''foo'';
echo ''bar'';
siempre imprimirá "barra"
Internamente es al revés: if
solo miramos la siguiente expresión, PHP trata todo en {}
como una sola expresión "agrupada".
Lo mismo para las otras instrucciones de control ( foreach
, etc.)
Es posible cuando solo tienes una expresión después de tu cláusula /
Por ejemplo,
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
es correcto, pero
foreach($var as $value)
$somevar = $var;
if(1 + 1 == 2) {
$arr[] = $value;
};
no lo es, y el intérprete php pensará que if
declaración está fuera de foreach
Hay lugares donde puedes, pero nunca deberías.
Explícito siempre es mejor que implícito.
Quién sabe cuándo tendrá que volver atrás y modificar el código anterior. Es muy fácil perder esas cosas y no hay nada ganado al hacerlo.
La respuesta es fácil. Esto es lo mismo en C / C ++.
if, if / else, if / else if / else y loops => Si la siguiente instrucción es una sola línea, puede omitir las llaves.
Ex:
for($i= 0; $i<=100; $i++)
{
if($i % 7 == 0)
{
echo $i . "<br>";
}
}
También se puede escribir de esta manera:
for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";
Omito las llaves en mis plantillas PHP. Por ejemplo, puedes usar loops de la siguiente manera:
<ul>
<?php foreach ($var as $value): ?>
<li><?php echo $value; ?></li>
<?php endforeach; ?>
</ul>
Para complementar la respuesta de @Marko , tenga en cuenta que cuando use el operador de punto para este asunto, debe encerrar cada operación entre paréntesis, de lo contrario, invertirá el orden.
Por ejemplo, este código a continuación imprimirá PHP >= 7.0 required yours is 5.6.15
.
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "/n");
Si bien esto imprimirá 5.6.151PHP >= 7.0 required yours is 1
.
print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("/n");
También puede usar el operador and
para que esto funcione. Al igual que:
if (PHP_VERSION_ID < 70000)
print("PHP >= 7.0 required yours is ") and
print(phpversion()) and
print("/n");
Para declaraciones de línea única.
Si intentaste hacer
foreach($array as $x => $y)
$do_something = $x;
$do_something_else = $y;
A menos que esté equivocado, el intérprete de php tomará la segunda línea en la declaración foreach por estar fuera de las llaves implícitas.
Debido a la sangría si volvió a este código en una fecha posterior, o si otro desarrollador miró su trabajo, sería confuso.
Como tal, generalmente es aconsejable usar llaves con estas declaraciones. Se ahorrará dolor de cabeza / confusión posterior
Puedes usarlo para cosas simples como:
if($a === true) continue;
Pero para algunas subcondiciones más complicadas, puede causarte problemas:
$a = false;
$b = false;
if ($a === true)
if ($b === true)
echo 1;
else
echo 2;
Con el código anterior, esperarías ver "2" como salida, pero no lo harás.
Como he dicho, no quieres aprender sobre la taquigrafía y la respuesta aceptada da un buen ejemplo de omisión de curly braces
, pero hay algo que agregar. Como puede ver, está bien omitir las curly braces
en caso de if ($x) echo ''foo'';
. No hay nada de malo con el código, sin rendimiento u otros problemas y otros desarrolladores lo pueden leer. Y el ejemplo también te muestra que si escribes
if ($x)
echo ''foo'';
echo ''bar'';
en lugar de
if ($x)
echo ''foo'';
echo ''bar'';
Puede encontrar resultados no deseados donde la bar
se imprime mientras no desea que se imprima y si su código está lleno de dichos enunciados, entonces le será más difícil leer su propio código y aún más difícil para que otros lean. eso.
No quiero aprender sobre taquigrafía. Solo quiero entender las condiciones sobre cuándo y dónde es posible omitir las llaves.
Estas cosas están estrechamente relacionadas, así que si realmente quiere saber dónde es posible omitir las llaves, entonces debe ser una necesidad que comprenda o al menos tenga en cuenta la taquigrafía, ha leído
- Estructuras de control de PHP
- Los operadores y expresiones condicionales ternarios de PHP en general
Entonces mi gran pregunta es: ¿cuándo puedo omitir las llaves y en qué estructura / lazo / función?
Sin embargo, la llave no es necesaria, para la legibilidad y el mantenimiento, muchos desarrolladores considerarían que es un mal estilo no incluirlos. Los enlaces previos 2 deberían proporcionarle la información necesaria para tomar sus propias decisiones cuando podría omitir la llave. por ejemplo, no hay nada de malo en seguir los fragmentos de código que hacen exactamente lo mismo.
Con rizador
if (PHP_VERSION_ID < 70000)
{
print "PHP >= 7.0 required yours is ";
print phpversion();
print "/n";
exit(1);
}
Es lo mismo que
if (PHP_VERSION_ID < 70000) :
print "PHP >= 7.0 required yours is ";
print phpversion();
print "/n";
exit(1);
endif;
O puede usar el operador punto
if (PHP_VERSION_ID < 80000)
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "/n") . exit(1);
Y puedes hacer uso del operador condicional ternario e incluso omitir if
además de omitir las llaves
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "/n") . exit(1);
Como solo imprimimos, podemos acortarlo y quitar algunas print string functions
que estaban aquí para representar más de una función en la frase sin llaves.
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "/n") . exit(1);
A partir de php 7, podemos usar el operador coalescente nulo
(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "/n") . exit(1);
Como se puede ver que hay muchas maneras en que puede obtener exactamente el mismo resultado. Eso no solo aplica para esto if
ejemplo pero lo mismo se puede practicar con structure/loop/function
. Entonces, no hay una respuesta para su gran pregunta . Uno debería considerar principalmente seguir.
- Es el código que está escribiendo fácil de mantener.
- ¿Puedes responder por ti mismo? Hay algo que ganas al omitir las llaves.