====== 02 - PHP III: Estructuras de control ======
===== Condicionales =====
==== if ====
El condicional simple, se escribe con la expresión [[https://www.php.net/manual/es/control-structures.if.php|if]]. Podemos añadir un bloques //else// al condional.
if ($a < 5) {
# codigo...
} else {
# codigo...
}
También podemos usar [[https://www.php.net/manual/es/control-structures.elseif.php|elseif]] para añadir más condiciones:
if ($a < 5) {
# codigo...
} elseif ($a < 10){
# codigo...
} else {
# codigo...
}
==== switch ====
Para el condicional múltiple, usaremos la expresión [[https://www.php.net/manual/es/control-structures.switch.php|switch]].
switch ($a) {
case 0:
# codigo...
break;
case 1:
# codigo...
break;
default:
# codigo...
break;
}
La lista de sentencias para un caso también puede estar vacías, lo que pasará el control a la lista de sentencias para el siguiente caso.
switch ($a) {
case 0:
case 1:
case 2:
# codigo1...
break;
case 3:
# codigo2...
break;
default:
# codigo3...
break;
}
En este caso, tanto si //\$a// vale 0, 1 o 2 se ejecutará //codigo1//.
No hay que olvidarse de añadir //break// al final de cada opción. En caso contrario, PHP seguiría ejecutando las sentencias del caso siguiente.
Para añadir la opción por defecto, utilizaremos //default//.
===== Bucles =====
==== while ====
Los bucles [[https://www.php.net/manual/es/control-structures.while.php|while]] son el tipo de bucle más sencillo en PHP. Se comportan igual que su contrapartida en C. La forma básica de una sentencia //while// es:
while ($a <= 10) {
# codigo...
}
==== do-while ====
Los bucles [[https://www.php.net/manual/es/control-structures.do.while.php|do-while]] son muy similares a los bucles //while//, excepto que la condición es verificada al final de cada iteración, en lugar de al principio. La principal diferencia es que en un bucle //do-while// se ejecutará la primera iteración siempre, mientras que un bucle //while// no tiene porque.
do {
# codigo...
} while ($a <= 10);
==== for ====
Los bucles [[https://www.php.net/manual/es/control-structures.for.php|for]] son los más complejos en PHP. Se comportan como sus homólogos en C. La sintaxis de un bucle //for// es:
for ($i=0; $i < 5; $i++) {
# codigo...
}
PHP ofrece la posibilidad de usar expresiones vacías en los bucles //for//, lo que puede resultar útil en alguna ocasión.
for ($i=0; ; $i++) {
if ($i < 5) {
break;
}
echo $i;
}
Para salir de cualquier bucle, se puede utilizar //break//, mientras que para continuar con la siguiente iteración podemos usar //continue//.
==== foreach ====
El constructor [[https://www.php.net/manual/es/control-structures.foreach.php|foreach]] proporciona un modo sencillo de iterar sobre //arrays//. //foreach// funciona sólo sobre //arrays// y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach ($array1 as $value) {
# codigo...
}
foreach ($array1 as $key => $value) {
# codigo...
}
La primera forma recorre el //array// //$array1//. En cada iteración el valor del elemento actual se asigna a //$value// y el puntero interno del array avanza una posición.
La segunda forma además asigna la clave del elemento actual a la variable //$key// en cada iteración.
echo "Hola, soy el archivo 1";
Lo podemos incluir en un segundo fichero //archivo2.php//:
echo "Hola, soy el archivo 2";
include "archivo1.php";
{{ clase:daw:dws:estructuras01.png?400 |}}
Como ves, la sentencia //include// es muy útil para separar y estructurar nuestro código.
Una cosa a tener en cuenta es que si incluimos dos veces el mismo archivo PHP no comprobará si ya está incluido, y lo volverá a incluir.
Para que no vuelva a incluir un fichero ya incluido podemos usar la sentencia [[https://www.php.net/manual/es/function.include-once.php|include_once]]. Tiene un comportamiento similar al de la sentencia //include//, con la diferencia que si el código del fichero ya se ha incluido, no se volverá a incluir, e //include_once// devolverá //TRUE//.
La sentencia [[https://www.php.net/manual/es/function.require.php|require]] es exactamente igual que //include//, excepto que en caso de fallo producirá un error fatal de nivel //E_COMPILE_ERROR//. En otras palabras, éste detiene el //script//, mientras que //include// sólo emitirá una advertencia, lo cual permite continuar el //script//.
Para ver la diferencia, modifica //archivo2.php// y cambia la ruta de //include// por algún archivo que no exista. A continuación saca por pantalla la frase //Hola mundo//:
echo "Hola, soy el archivo 2";
include "archivo3.php";
echo "Hola mundo";
Si vemos la salida en el navegador observamos que aunque nos de una advertencia, el //script// sigue ejecutándose mostrando la frase //Hola mundo// al final.
{{ clase:daw:dws:estructuras02.png?200 |}}
Ahora cambia //include// por //require// y comprueba la salida.
{{ clase:daw:dws:estructuras03.png?200 |}}
En esta ocasión, el intérprete PHP nos advierte del fallo y además nos da un //Fatal error//. Además, ya no saca la frase //Hola mundo//, ya que en cuanto genera el error detiene el //script//.
¿Cuándo utilizar //include// y cuando //require//? Cuando el código a insertar sea imprescindible para el funcionamiento de nuestro script, debemos utilizar //require//. En caso contrario, usaremos //include// para que nuestra web pueda seguir funcionando.
require(“archivo3.php");
Aunque esa sintaxis funcione sin problemas, //include// o //require// no son funciones, si no sentencias que forman parte de la estructura de control, por eso se aconseja utilizar la primera forma.
try {
//codigo...
} catch (Exception $e) {
//codigo...
} finally {
//codigo...
}
===== Ejercicios =====
**Ejercicio 1**
Para no romper la costumbre, nuestro primer ejercicio será crear un archivo PHP que imprima mediante //echo// o //print// la frase //Hello World//.
**Ejercicio 2**
Modifica el ejercicio anterior para que la primera palabra (//Hello//) esté contenida en una variable.
**Ejercicio 3**
Crear una página HTML donde se mostrará un título con la etiqueta //