ESTRUCTURAS DE CONTROL
Todo script PHP está construido en
base a una serie de sentencias. Una sentencia puede ser una asignación, una
llamada de función, un ciclo, una sentencia condicional o incluso una sentencia
que no hace nada (una sentencia vacía). Las sentencias generalmente finalizan
con un punto y coma. Adicionalmente, las sentencias pueden agruparse en un
conjunto de sentencias, encapsulándolas entre corchetes. Un grupo de sentencias
es una sentencia por sí misma también.
ESTRUCTURAS
CONDICIONALES
En PHP existen una serie de
instrucciones que permiten tomar decisiones lógicas cuando programamos: estas
instrucciones, comunes a distintos lenguajes de programación, se suelen
denominar de forma general "condicionales".
If:
El constructor if es una de las características más importantes de muchos
lenguajes, incluido PHP. Permite la ejecución condicional de fragmentos de
código. PHP dispone de una estructura if que es similar a la de C:
if (expr)
sentencia
Como se describe en la sección sobre
expresiones, la expresión es evaluada a su valor booleano. Si la expresión se
evalúa como TRUE, PHP ejecutará la sentencia y si se evalúa como FALSE la
ignorará. Más información sobre qué valores evalúan como FALSE se puede encontrar
en la sección 'Convirtiendo a booleano'.
El siguiente ejemplo mostraría a es mayor
que b si $a es mayor que $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
}
?>
if ($a > $b) {
echo "a es mayor que b";
}
?>
A menudo se desea tener más de una
sentencia para ser ejecutada condicionalmente. Por supuesto, no hay necesidad
de envolver cada sentencia con una cláusula if. En cambio, se pueden agrupar
varias sentencias en un grupo de sentencias. Por ejemplo, este código mostraría
a es mayor que b si $a es mayor que $b y entonces asignaría el valor de $a a
$b:
<?php
if ($a > $b) {
echo "a es mayor que b";
$b = $a;
}
?>
if ($a > $b) {
echo "a es mayor que b";
$b = $a;
}
?>
else: Con
frecuencia se desea ejecutar una sentencia si una determinada condición se
cumple y una sentencia diferente si la condición no se cumple. Esto es para lo
que sirve else. El else extiende una sentencia if para ejecutar una sentencia
en caso que la expresión en la sentencia if se evalúe como FALSE. Por ejemplo, el siguiente código deberá mostrar a es mayor
que b si $a es mayor que $b y a NO es mayor que b en el caso contrario:
<?php
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
elseif/else if: elseif,
como su nombre lo sugiere, es una combinación de if y else. Del mismo modo que
else, extiende una sentencia if para ejecutar una sentencia diferente en caso
que la expresión if original se evalúe como FALSE. Sin embargo, a diferencia de else, esa expresión alternativa
sólo se ejecutará si la expresión condicional del elseif se evalúa como TRUE. Por ejemplo, el siguiente código
debe mostrar a es mayor que b, a es igual que b o a es menor que b:
<?php
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a == $b) {
echo "a es igual que b";
} else {
echo "a es menor que b";
}
?>
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a == $b) {
echo "a es igual que b";
} else {
echo "a es menor que b";
}
?>
Puede haber varios elseif dentro de la
misma sentencia if. La primera expresión elseif (si hay alguna) que se evalúe
como TRUE sería ejecutada. En PHP
también se puede escribir 'else if' (en dos palabras) y el comportamiento sería
idéntico al de 'elseif' (en una sola palabra). El significado sintáctico es
ligeramente diferente (si se está familiarizado con C, este es el mismo
comportamiento) pero la conclusión es que ambos resultarían tener exactamente
el mismo comportamiento.
La sentencia elseif es ejecutada
solamente si la expresión if precedente y cualquiera de las expresiones elseif
precedentes son evaluadas como FALSE,
y la expresión elseif actual se evalúa como TRUE.
Nota: Tenga
en cuenta que elseif y else if serán considerados exactamente iguales sólamente
cuando se utilizan corchetes como en el ejemplo anterior. Al utilizar los dos
puntos para definir las condiciones if/elseif, no debe separarse else if en dos
palabras o PHP fallará con un error del interprete.
Sintaxis alternativa de estructuras de control
PHP ofrece
una sintaxis alternativa para algunas de sus estructuras de control; a saber:
if, while, for, foreach, y switch. En cada caso, la forma básica de la sintaxis
alternativa es cambiar el corchete de apertura por dos puntos (:) y el corchete
de cierre por endif;, endwhile;, endfor;, endforeach;, o endswitch;,
respectivamente.
<?php if ($a == 5): ?>
A es igual a 5
<?php endif; ?>
A es igual a 5
<?php endif; ?>
while: Los bucles
while son el tipo más sencillo de bucle en PHP. Se comportan igual que su
contrapartida en C. La forma básica de una sentencia while es:
while (expr)
sentencia
El significado de una sentencia while
es simple. Le dice a PHP que ejecute las sentencias anidadas, tanto como la
expresión while se evalúe como TRUE. El valor de la expresión es verificado
cada vez al inicio del bucle, por lo que incluso si este valor cambia durante
la ejecución de las sentencias anidadas, la ejecución no se detendrá hasta el
final de la iteración (cada vez que PHP ejecuta las sentencias contenidas en el
bucle es una iteración). A veces, si la expresión while se evalúa como FALSE desde el principio, las
sentencias anidadas no se ejecutarán ni siquiera una vez.
do-while:
Los bucles do-while son muy similares a los bucles while, excepto que la
expresión verdadera es verificada al final de cada iteración en lugar que al
principio. La diferencia principal con los bucles while es que está garantizado
que corra la primera iteración de un bucle do-while (la expresión verdadera
sólo es verificada al final de la iteración), mientras que no necesariamente va
a correr con un bucle while regular (la expresión verdadera es verificada al
principio de cada iteración, si se evalúa como FALSE justo desde el comienzo, la ejecución del bucle terminaría
inmediatamente).
Hay una
sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
For: Los bucles
for son los más complejos en PHP. Se comportan como sus homólogos en C. La
sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresión (expr1) es evaluada
(ejecutada) una vez incondicionalmente al comienzo del bucle.
En el
comienzo de cada iteración, se evalúa expr2. Si se evalúa como TRUE, el bucle continúa y se ejecutan la/sy
sentencia/s anidada/s. Si se evalúa como FALSE,
finaliza la ejecución del bucle.
Al final de
cada iteración, se evalúa (ejecuta) expr3.
Cada una de las expresiones puede estar
vacía o contener múltiples expresiones separadas por comas. En expr2, todas las
expresiones separadas por una coma son evaluadas, pero el resultado se toma de
la última parte. Que expr2 esté vacía significa que el bucle debería ser
corrido indefinidamente (PHP implícitamente lo considera como TRUE, como en C).
Esto puede no ser tan inútil como se pudiera pensar, ya que muchas veces se
debe terminar el bucle usando una sentencia condicional break en lugar de
utilizar la expresión verdadera del for.
foreach: El
constructor 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 (expresión_array as $valor)
sentencias
foreach (expresión_array as $clave => $valor)
sentencias
La primera forma recorre el array
dado por expresión_array. En cada iteración, el valor del elemento actual se
asigna a $valor y el puntero interno del array avanza una posición (así en la
próxima iteración se estará observando el siguiente elemento).
La segunda forma además asigna la
clave del elemento actual a la variable $clave en cada iteración.
break: break
termina la ejecución de la estructura actual for, foreach, while, do-while o
switch.
break acepta un argumento numérico
opcional el cual indica de cuantas estructuras anidadas encerradas se debe
salir.
<?php
$arr = array('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list(, $val) = each($arr)) {
if ($val == 'pare') {
break; /* Se puede también escribir 'break 1;' aquí. */
}
echo "$val<br />\n";
}
/* Usando el argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "En 5<br />\n";
break 1; /* Sólo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */
default:
break;
}
}
?>
$arr = array('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list(, $val) = each($arr)) {
if ($val == 'pare') {
break; /* Se puede también escribir 'break 1;' aquí. */
}
echo "$val<br />\n";
}
/* Usando el argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "En 5<br />\n";
break 1; /* Sólo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */
default:
break;
}
}
?>
continue: continue
se utiliza dentro de las estructuras iterativas para saltar el resto de la
iteración actual del bucle y continuar la ejecución en la evaluación de la
condición, y luego comenzar la siguiente iteración.
Switch: La
sentencia switch es similar a una serie de sentencias IF en la misma expresión.
En muchas ocasiones, es posible que se quiera comparar la misma variable (o
expresión) con muchos valores diferentes, y ejecutar una parte de código
distinta dependiendo de a qué valor es igual. Para esto es exactamente la
expresión switch.
Declare: El
constructor declare es usado para fijar directivas de ejecución para un bloque
de código. La sintaxis de declare es similar a la sintaxis de otros constructores
de control de flujo:
declare (directive)
statement
La
sección directive permite que el comportamiento de declare sea configurado.
Actualmente, sólo dos directivas están reconocidas: ticks y encoding
return: return
devuelve el control del programa a el modulo que lo invoca. La ejecución vuelve
a la siguiente declaración después del módulo que lo invoca.
Si se llama desde una función, la
sentencia return inmediatamente termina la ejecución de la función actual, y
devuelve su argumento como el valor de la llamada a la función. return también
termina la ejecución de una sentencia eval() o un archivo de script.
Si se llama desde el ámbito global,
entonces la ejecución del script actual se termina. Si el archivo script actual
fue incluido o requerido con include o require, entonces el control es pasado
de regreso al archivo que hizo el llamado. Además, si el archivo script actual
fue incluido con include, entonces el valor dado a return será retornado como
el valor de la llamada include. Si return es llamado desde dentro del fichero
del script principal, entonces termina la ejecución del script. Si el archivo
script actual fue nombrado por las opciones de configuración auto_prepend_file
o auto_append_file en php.ini, entonces se termina la ejecución de ese archivo
script.
require: require es
idéntico a 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 (E_WARNING) lo cual permite continuar el
script.
include: La sentencia
include incluye y evalúa el archivo especificado.
La siguiente documentación también se
aplica a require.
Los archivos son incluidos con base en
la ruta de acceso dada o, si ninguna es dada, el include_path especificado. Si
el archivo no se encuentra en el include_path, include finalmente verificará en
el propio directorio del script que hace el llamado y en el directorio de
trabajo actual, antes de fallar. El constructor include emitirá una advertencia
si no puede encontrar un archivo, éste es un comportamiento diferente al de
require, el cual emitirá un error fatal..
require_once: La
sentencia require_once es idéntica a require excepto que PHP verificará si el
archivo ya ha sido incluido y si es así, no se incluye (require) de nuevo.
include_once: La
sentencia include_once incluye y evalúa el fichero especificado durante la
ejecución del script. Es un comportamiento similar al de la sentencia include,
siendo la única diferencia que si el código del fichero ya ha sido incluido, no
se volverá a incluir. Como su nombre lo indica, será incluido sólo una vez.
include_once puede ser usado en casos
donde el mismo fichero podría ser incluido y evaluado más de una vez durante
una ejecución particular de un script, así que en este caso, puede ayudar a
evitar problemas como la redefinición de funciones, reasignación de valores de
variables, etc.
Nota:
Con PHP 4, la funcionalidad _once
difiere entre sistemas operativos insensibles a mayúsculas y minúsculas (como
Windows) así que por ejemplo:
Ejemplo #1 include_once con un SO
insensible a mayúsculas y minúsculas en PHP 4
<?php
include_once "a.php"; // esto incluirá a.php
include_once "A.php"; // esto incluirá a.php otra vez! (sólo PHP 4)
?>
include_once "a.php"; // esto incluirá a.php
include_once "A.php"; // esto incluirá a.php otra vez! (sólo PHP 4)
?>
goto: El operador
goto puede ser usado para saltar a otra sección en el programa. El punto de
destino es especificado mediante una etiqueta seguida de dos puntos y la
instrucción es dada como goto seguida de la etiqueta del destino deseado. Este
goto no es completamente sin restricciones. La etiqueta de destino debe estar
dentro del mismo fichero y contexto, lo que significa que no se puede saltar
fuera de una función o método, ni se puede saltar dentro de uno. Tampoco se
puede saltar dentro de cualquier clase de estructura de bucle o switch. Se puede
saltar fuera de estos y un uso común es utilizar un goto en lugar de un break
multi-nivel.
Ejemplo #1
Ejemplo de goto
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
El resultado del ejemplo sería:
Bar






0 comentarios:
Publicar un comentario