Você está na página 1de 33

if

(PHP 4, PHP 5, PHP 7)


El constructor if es una de las caractersticas ms importantes de
muchos lenguajes, incluido PHP. Permite la ejecucin condicional de
fragmentos de cdigo. PHP dispone de una estructura if que es similar
a la de C:
if (expr)
sentencia
Como se describe en la seccin sobre expresiones , la expresin es
evaluada a su valor booleano. Si la expresin se evala como TRUE,
PHP ejecutar la sentencia y si se evala como FALSE la ignorar.
Ms informacin sobre qu valores evalan como FALSE se puede
encontrar en la seccin 'Convirtiendo a booleano'.
El siguiente ejemplo mostrara a es mayor que b si $a es mayor que
$b:
<?php
if ($a > $b) {
echo "a es mayor que b";
}
?>
A menudo se desea tener ms de una sentencia para ser ejecutada
condicionalmente. Por supuesto, no hay necesidad de envolver cada
sentencia con una clusula if. En cambio, se pueden agrupar varias
sentencias en un grupo de sentencias. Por ejemplo, este cdigo
mostrara a es mayor que b si $a es mayor que $b y entonces
asignara el valor de $a a $b:
<?php
if ($a > $b) {
echo "a es mayor que b";
$b = $a;
}
?>
Las sentencias if pueden anidarse dentro de otra sentencias if
infinitamente, lo cual provee completa flexibilidad para la ejecucin
condicional de diferentes partes del programa.

else
(PHP 4, PHP 5, PHP 7)

Con frecuencia se desea ejecutar una sentencia si una determinada


condicin se cumple y una sentencia diferente si la condicin no se
cumple. Esto es para lo que sirve else. El else extiende una sentencia
if para ejecutar una sentencia en caso que la expresin en la
sentencia if se evale como FALSE. Por ejemplo, el siguiente cdigo
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";
}
?>
La sentencia else slo es ejecutada si la expresin if es evaluada
como FALSE y si hay algunas expresiones elseif - slo se ejecuta si
tambin todas son evaluadas como FALSE (ver elseif).

elseif/else if
(PHP 4, PHP 5, PHP 7)
elseif, como su nombre lo sugiere, es una combinacin de if y else.
Del mismo modo que else, extiende una sentencia if para ejecutar
una sentencia diferente en caso que la expresin if original se evale
como FALSE. Sin embargo, a diferencia de else, esa expresin
alternativa slo se ejecutar si la expresin condicional del elseif se
evala como TRUE. Por ejemplo, el siguiente cdigo 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";
}
?>
Puede haber varios elseif dentro de la misma sentencia if. La primera
expresin elseif (si hay alguna) que se evale como TRUE sera
ejecutada. En PHP tambin se puede escribir 'else if' (en dos palabras)
y el comportamiento sera idntico al de 'elseif' (en una sola palabra).
El significado sintctico es ligeramente diferente (si se est
familiarizado con C, este es el mismo comportamiento) pero la

conclusin es que ambos resultaran tener exactamente el mismo


comportamiento.
La sentencia elseif es ejecutada solamente si la expresin if
precedente y cualquiera de las expresiones elseif precedentes son
evaluadas como FALSE, y la expresin elseif actual se evala como
TRUE.
Nota: Tenga en cuenta que elseif y else if sern considerados
exactamente iguales slamente cuando se utilizan llaves 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.
<?php
/* Mtodo incorrecto: */
if($a > $b):
echo $a." es mayor que ".$b;
else if($a == $b): // No compilar
echo "La lnea anterior provoca un error del interprete.";
endif;
/* Mtodo correcto: */
if($a > $b):
echo $a." es mayor que ".$b;
elseif($a == $b): // Tenga en cuenta la combinacin de las palabras.
echo $a." igual ".$b;
else:
echo $a." no es ni mayor que ni igual a ".$b;
endif;
?>

Sintaxis alternativa de estructuras de control


(PHP 4, PHP 5, PHP 7)
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 bsica 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; ?>

En el ejemplo anterior, el bloque HTML "A es igual a 5" se anida


dentro de una sentencia if escrita en la sintaxis alternativa. El bloque
HTML se mostrara solamente si $a es igual a 5.
La sintaxis alternativa tambin se aplica a else y elseif. El siguiente es
una estructura if con elseif y else en el formato alternativo:
<?php
if ($a == 5):
echo "a igual 5";
echo "...";
elseif ($a == 6):
echo "a igual 6";
echo "!!!";
else:
echo "a no es 5 ni 6";
endif;
?>
Nota:
No se admite la mezcla de sintaxis en el mismo bloque de control.
Advertencia
Cualquier salida (incluyendo espacios en blanco) entre una sentencia
switch y el primer case resultar en un error de sintaxis. Por ejemplo,
esto no es vlido:
<?php switch ($foo): ?>
<?php case 1: ?>
...
<?php endswitch ?>
Mientras que esto es vlido, ya que la nueva lnea al final despus de
la sentencia switch es considerada como parte del ?> de cierre, no
generando nada entre el switch y el case:
<?php switch ($foo): ?>
<?php case 1: ?>
...
<?php endswitch ?>
while
(PHP 4, PHP 5, PHP 7)

Los bucles while son el tipo ms sencillo de bucle en PHP. Se


comportan igual que su contrapartida en C. La forma bsica 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 expresin while se
evale como TRUE. El valor de la expresin es verificado cada vez al
inicio del bucle, por lo que incluso si este valor cambia durante la
ejecucin de las sentencias anidadas, la ejecucin no se detendr
hasta el final de la iteracin (cada vez que PHP ejecuta las sentencias
contenidas en el bucle es una iteracin). A veces, si la expresin
while se evala como FALSE desde el principio, las sentencias
anidadas no se ejecutarn ni siquiera una vez.
Al igual que con la sentencia if, se pueden agrupar varias
instrucciones dentro del mismo bucle while rodeando un grupo de
sentencias con corchetes, o utilizando la sintaxis alternativa:
while (expr):
sentencias
...
endwhile;
Los siguientes ejemplos son idnticos y ambos presentan los nmeros
del 1 al 10:
<?php
/* ejemplo 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* el valor presentado sera
$i antes del incremento
(post-incremento) */
}
/* ejemplo 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
do-while
(PHP 4, PHP 5, PHP 7)

Los bucles do-while son muy similares a los bucles while, excepto que
la expresin verdadera es verificada al final de cada iteracin en lugar
que al principio. La diferencia principal con los bucles while es que
est garantizado que corra la primera iteracin de un bucle do-while
(la expresin verdadera slo es verificada al final de la iteracin),
mientras que no necesariamente va a correr con un bucle while
regular (la expresin verdadera es verificada al principio de cada
iteracin, si se evala como FALSE justo desde el comienzo, la
ejecucin del bucle terminara inmediatamente).
Hay una sola sintaxis para bucles do-while:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
El bucle de arriba se ejecutara exactamente una sola vez, ya que
despus de la primera iteracin, cuando la expresin verdadera es
verificada, se evala como FALSE ($i no es mayor que 0) y termina la
ejecucin del bucle.
Los usuarios avanzados de C pueden estar familiarizados con un uso
distinto del bucle do-while, para permitir parar la ejecucin en medio
de los bloques de cdigo, mediante el encapsulado con do-while (0), y
utilizando la sentencia break. El siguiente fragmento de cdigo
demuestra esto:
<?php
do {
if ($i < 5) {
echo "i no es lo suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i est bien";
/* procesar i */
} while (0);
?>
No se preocupe si no se entiende esto completamente o en absoluto.
Se pueden codificar scripts e incluso scripts potentes sin usar esta
'caracterstica'. Desde PHP 5.3.0, es posible utilizar el operador goto
en lugar de este hack.

for
(PHP 4, PHP 5, PHP 7)
Los bucles for son los ms complejos en PHP. Se comportan como sus
homlogos en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3)
sentencia
La primera expresin (expr1) es evaluada (ejecutada) una vez
incondicionalmente al comienzo del bucle.
En el comienzo de cada iteracin, se evala expr2. Si se evala como
TRUE, el bucle contina y se ejecutan la/sy sentencia/s anidada/s. Si
se evala como FALSE, finaliza la ejecucin del bucle.
Al final de cada iteracin, se evala (ejecuta) expr3.
Cada una de las expresiones puede estar vaca o contener mltiples
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 vaca significa que el bucle debera
ser corrido indefinidamente (PHP implcitamente lo considera como
TRUE, como en C). Esto puede no ser tan intil como se pudiera
pensar, ya que muchas veces se debe terminar el bucle usando una
sentencia condicional break en lugar de utilizar la expresin
verdadera del for.
Considere los siguientes ejemplos. Todos ellos muestran los nmeros
del 1 al 10:
<?php
/* ejemplo 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* ejemplo 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;

}
echo $i;
}
/* ejemplo 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* ejemplo 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Por supuesto, el primer ejemplo parece ser el mejor (o quizs el
cuarto), pero se puede observar que la posibilidad de usar
expresiones vacas en los bucles for resulta til en muchas ocasiones.
PHP tambin admite la sintaxis alternativa de los dos puntos para
bucles for.
for (expr1; expr2; expr3):
sentencia
...
endfor;
Es una cosa comn a muchos usuarios iterar por medio de arrays
como en el siguiente ejemplo.
<?php
/*
* Este es un array con algunos datos que se quieren modificar
* cuando se recorra el bucle for.
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
El cdigo anterior puede ser lento, debido a que el tamao del array
se capta en cada iteracin. Dado que el tamao nunca cambia, el
bucle puede ser fcilmente optimizado mediante el uso de una
variable intermedia para almacenar el tamao en lugar de llamar
repetidamente a count():

<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

foreach
(PHP 4, PHP 5, PHP 7)
El constructor foreach proporciona un modo sencillo de iterar sobre
arrays. foreach funciona slo 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 (expresin_array as $valor)
sentencias
foreach (expresin_array as $clave => $valor)
sentencias
La primera forma recorre el array dado por expresin_array. En cada
iteracin, el valor del elemento actual se asigna a $valor y el puntero
interno del array avanza una posicin (as en la prxima iteracin se
estar observando el siguiente elemento).
La segunda forma adems asigna la clave del elemento actual a la
variable $clave en cada iteracin.
Tambin es posible personalizar la iteracin de objetos.
Nota:
En PHP 5, cuando foreach inicia su ejecucin, el puntero interno del
array se pone automticamente en el primer elemento del array. Esto
significa que no es necesario llamar la funcin reset() antes de un
bucle foreach.

Ya que foreach depende el puntero de array interno en PHP 5, cambiar


ste dentro del bucle puede conducir a un comportamiento
inesperado.
En PHP 7, foreach no utilizar el puntero interno del array.
Para poder modificar directamente los elementos del array dentro de
bucle, se ha de anteponer & a $valor. En este caso el valor ser
asignado por referencia.
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
unset($valor); // rompe la referencia con el ltimo elemento
?>
Advertencia
La referencia del $valor y el ltimo elemento del array permanecen
an despus del bucle foreach. Se recomienda destruirlos con unset().
De lo contrario, se experimentar el siguiente funcionamiento:
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$valor) {
$valor = $valor * 2;
}
// $array ahora es array(2, 4, 6, 8)
// sin unset($valor), $valor an es una referencia al ltimo elemento:
$array[3]
foreach ($array as $clave => $valor) {
// $array[3] se actualizar con cada valor de $array...
echo "{$clave} => {$valor} ";
print_r($array);
}
// ...hasta que finalmente el penltimo valor se copia al ltimo valor
//
//
//
//

salida:
0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )

// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>
Antes de PHP 5.5.0, referenciar $valor slo es posible si el array
iterado puede ser referenciado (es decir, si es una variable). El
siguiente cdigo solamente funciona a partir de PHP 5.5.0:
<?php
foreach (array(1, 2, 3, 4) as &$valor) {
$valor = $valor * 2;
}
?>
Nota:
foreach no soporta la capacidad de suprimir mensajes de error
usando '@'.
Se puede haber notado que las siguientes construcciones son
funcionalmente idnticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list(, $valor) = each($array)) {
echo "Valor: $valor<br />\n";
}
foreach ($array as $valor) {
echo "Valor: $valor<br />\n";
}
?>
Las siguientes construcciones tambin son funcionalmente idnticas:
<?php
$array = array("uno", "dos", "tres");
reset($array);
while (list($clave, $valor) = each($array)) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
foreach ($array as $clave => $valor) {
echo "Clave: $clave; Valor: $valor<br />\n";
}
?>
Algunos ejemplos ms para demostrar su uso:

<?php
/* Ejemplo 1 de foreach: slo el valor */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valor actual de \$a: $v.\n";
}
/* Ejemplo 2 de foreach: valor (con su notacin de acceso manual imp
reso con fines ilustrativos) */
$a = array(1, 2, 3, 17);
$i = 0; /* slo para efectos ilustrativos */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* Ejemplo 3 de foreach: clave y valor */
$a = array(
"uno" => 1,
"dos" => 2,
"tres" => 3,
"diecisiete" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* Ejemplo 4 de foreach: arrays multidimensionales */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}

/* Ejemplo 5 de foreach: arrays dinmicos */


foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
Utilizando arrays anidados con list()
(PHP 5 >= 5.5.0, PHP 7)
PHP 5.5 aade la posibilidad de recorrer un array de arrays y utilizar
el array interior en las variables del bucle proporcionando list() como
el valor.
Por ejemplo:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a contiene el primer elemento del array interior,
// y $b contiene el segundo elemento.
echo "A: $a; B: $b\n";
}
?>
El resultado del ejemplo sera:
A: 1; B: 2
A: 3; B: 4
Puedes proporcionar menos elementos a list() de los que hay en el
array interior, en cuyo caso los elementos sobrantes del array sern
descartados:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Observa que no hay $b en este caso.
echo "$a\n";

}
?>
El resultado del ejemplo sera:
1
3
Se generar un notice si no hay suficientes elementos en el array
para completar el list():
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
El resultado del ejemplo sera:
Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:
Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:
Historial de cambios
Versi
Descripcin
n
7.0.0

foreach ya no utiliza el puntero interno al array.

5.5.0

Hacer referencia a $valor est admitido para expresiones.


Anteriormente, solamente estaban admitidas las variables.

5.5.0

El desempaquetamiento de arrays anidados con list() est


admitido.

Break
(PHP 4, PHP 5, PHP 7)

break finaliza la ejecucin de la estructura for, foreach, while, dowhile o switch en curso.
break acepta un argumento numrico opcional que indica de cuntas
estructuras anidadas circundantes se debe salir. El valor
predeterminado es 1, es decir, solamente se sale de la estructura
circundante inmediata.
<?php
$arr = array('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list(, $val) = each($arr)) {
if ($val == 'pare') {
break; /* Se puede tambin escribir 'break 1;' aqu. */
}
echo "$val<br />\n";
}
/* Utilizar el argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "En 5<br />\n";
break 1; /* Slo sale del switch. */
case 10:
echo "En 10; saliendo<br />\n";
break 2; /* Sale del switch y del while. */
default:
break;
}
}
?>
Registro de cambios para break
Versi
Descripcin
n
break 0; ya no es vlido. En versiones anteriores se
5.4.0
interpretaba igual que break 1;.
Eliminada la posibilidad de pasar variables (por ejemplo,
5.4.0
$num = 2; break $num;) como argumento numrico.

continue
(PHP 4, PHP 5, PHP 7)
continue se utiliza dentro de las estructuras iterativas para saltar el
resto de la iteracin actual del bucle y continuar la ejecucin en la

evaluacin de la condicin, para luego comenzar la siguiente


iteracin.
Nota: En PHP, la sentencia switch se considera una estructura
iterativa para los propsitos de continue. continue se comporta igual
que break (cuando no se proporcionan argumentos). Si un switch est
dentro de un bucle, continue 2 continur con la siguiente iteracin del
bucle externo.
continue acepta un argumento numrico opcional, que indica a
cuntos niveles de bucles encerrados se ha de saltar al final. El valor
por omisin es 1, por lo que salta al final del bucle actual.
<?php
while (list($clave, $valor) = each($arr)) {
if (!($clave % 2)) { // saltar los miembros pares
continue;
}
hacer_algo($valor);
}
$i = 0;
while ($i++ < 5) {
echo "Exterior<br />\n";
while (1) {
echo "Medio<br />\n";
while (1) {
echo "Interior<br />\n";
continue 3;
}
echo "Esto nunca se imprimir.<br />\n";
}
echo "Ni esto tampoco.<br />\n";
}
?>
Omitir el punto y coma despus del continue puede llevar a
confusin. He aqu un ejemplo de lo que no se debe hacer.
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
Se esperara que el resultado fuera:
0

1
3
4
pero, en versiones de PHP anteriores a la 5.4.0, la salida de este script
ser:
2
debido a que continue print "$i\n"; se evala completo como una sola
expresin, y as print se llama solamente cuando $i == 2 es
verdadero. (El valor de retorno de print es pasado a continue como el
argumento numrico.)
Nota:
A partir de PHP 5.4.0, el ejemplo anterior emitir un error
E_COMPILE_ERROR.
Registro de cambios para continue
Versi
Descripcin
n
continue 0; ya no es vlido. En versiones anteriores era
5.4.0
interpretado de la misma manera que continue 1;.
Se elimin la posibilidad de pasar variables (por ejemplo,
5.4.0
$num = 2; continue $num;) como el argumento numrico.

switch
(PHP 4, PHP 5, PHP 7)
La sentencia switch es similar a una serie de sentencias IF en la
misma expresin. En muchas ocasiones, es posible que se quiera
comparar la misma variable (o expresin) con muchos valores
diferentes, y ejecutar una parte de cdigo distinta dependiendo de a
que valor es igual. Para esto es exactamente la expresin switch.
Nota: Cabe sealar que a diferencia de algunos otros lenguajes, la
sentencia continue se aplica a switch y acta de manera similar a
break. Si se tiene un switch dentro de un bucle y se desea continuar a
la siguiente iteracin de del ciclo exterior, se utiliza continue 2.
Nota:
Tener en cuenta que switch/case hace comparaciones flexibles.

Historial de cambios
Versi
Descripcin
n
Mltiples casos predeterminados (default) emitirn un error de
7.0.0
tipo E_COMPILE_ERROR.
Los dos ejemplos siguientes son dos formas diferentes de escribir lo
mismo, uno con una serie de sentencias if y elseif, y el otro usando la
sentencia switch:
Ejemplo #1 Estructura switch
<?php
if ($i == 0) {
echo "i es igual a 0";
} elseif ($i == 1) {
echo "i es igual a 1";
} elseif ($i == 2) {
echo "i es igual a 2";
}
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
}
?>
Ejemplo #2 Estrutura switch permite el uso de strings
<?php
switch ($i) {
case "manzana":
echo "i es una manzana";
break;
case "barra":
echo "i es una barra";
break;
case "pastel":
echo "i es un pastel";
break;
}
?>

Es importante entender cmo la sentencia switch es ejecutada con el


fin de evitar errores. La sentencia switch ejecuta lnea por lnea (en
realidad, sentencia por sentencia). Al principio, ningn cdigo es
ejecutado. Solo cuando se encuentra una sentencia case cuya
expresin se evala a un valor que coincida con el valor de la con un
valor que coincide con el valor de la expresin switch, PHP comienza
a ejecutar la sentencias. PHP contina ejecutando las sentencias
hasta el final del bloque switch, o hasta la primera vez que vea una
sentencia break. Si no se escribe una sentencia break al final de la
lista de sentencias de un caso, PHP seguir ejecutando las sentencias
del caso siguiente. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
case 1:
echo "i es igual a 1";
case 2:
echo "i es igual a 2";
}
?>
Aqu, si $i es igual a 0, PHP ejecutara todas las sentencias echo! Si $i
es igual a 1, PHP ejecutara las ltimas dos sentencias echo. Se
obtendra el comportamiento esperado (se mostrara 'i es igual a 2')
slo si $i es igual a 2. Por lo tanto, es importante no olvidar las
sentencias break (aunque es posible que se desee evitar
proporcionarlas a propsito bajo determinadas circunstancias).
En una sentencia switch, la condicin es evaluada slo una vez y el
resultado es comparado con cada una de las sentencias case. En una
sentencia elseif, la condicin es evaluada otra vez. Si la condicin es
ms complicada que una simple comparacin y/o est en un bucle
estrecho, un switch puede ser ms rpido.
La lista de sentencias para un caso tambin puede estar vaca, lo cual
simplemente pasa el control a la lista de sentencias para el siguiente
caso.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i es menor que 3 pero no negativo";
break;
case 3:
echo "i es 3";

}
?>
Un caso especial es el default. Este caso coincide con cualquier cosa
que no se haya correspondido por los otros casos. Por ejemplo:
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
case 2:
echo "i es igual a 2";
break;
default:
echo "i no es igual a 0, 1 ni 2";
}
?>
La sintaxis alternativa para las estructuras de control es compatible
con los switch. Para obtener ms informacin, consulte Sintaxis
alternativa de estructuras de control.
<?php
switch ($i):
case 0:
echo "i
break;
case 1:
echo "i
break;
case 2:
echo "i
break;
default:
echo "i
endswitch;
?>

es igual a 0";
es igual a 1";
es igual a 2";
no es igual a 0, 1 ni 2";

Es posible utilizar un punto y coma en lugar de dos puntos despus


de un caso como:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';

case 'heineken';
echo 'Buena eleccin';
break;
default;
echo 'Por favor haga una nueva seleccin...';
break;
}
?>

declare
(PHP 4, PHP 5, PHP 7)
El constructor declare es usado para fijar directivas de ejecucin para
un bloque de cdigo. La sintaxis de declare es similar a la sintaxis de
otros constructores de control de flujo:
declare (directive)
statement
La seccin directive permite que el comportamiento de declare sea
configurado. Actualmente, solamente estn reconocidas tres
directivas: ticks (vase abajo para ms informacin sobre la directiva
ticks), encoding (vase abajo para ms informacin sobre la directiva
encoding) y strict_types (para ms infomacin, vase la seccin strict
de la pgina de Argumentos de funciones)
Versin

Descripcin

5.3.0

Se aadi la directiva encoding

7.0.0

Se aadi la directiva strict_types

Ya que las directivas se manejan mientras el fichero est siendo


compilado, solamente se pueden proporcionar literales como valores
de directivas. No se pueden emplear variables ni constantes. Como
ejemplo:
<?php
// Esto es vlido:
declare(ticks=1);
// Esto no es vlido:
const TICK_VALUE = 1;
declare(ticks=TICK_VALUE);
?>

La parte statement del bloque declare ser ejecutada - como se


ejecuta y que efectos secundarios ocurran durante la ejecucin puede
depender de la directiva fijada en el bloque directive.
El constructor declare tambin se puede utilizar en el alcance global,
afectando a todo el cdigo que le sigue (sin embargo, si el archivo
con el declare fue incluido entonces no afectar al archivo padre).
<?php
// estos son lo mismo:
// se puede usar sto:
declare(ticks=1) {
// script entero aqu
}
// o se puede usar sto:
declare(ticks=1);
// script entero aqu
?>
Ticks
Un tick es un evento que ocurre para cada sentencia tickable N de
bajo nivel ejecutada por el intrprete dentro del bloque declare. El
valor para N se especifica usando ticks=N dentro del bloque de
declare de la seccin directive.
No todas las sentencias son tickable. Por lo general, expresiones de
condicin y expresiones de argumento no son tickables.
Los eventos que ocurren en cada tick se especifican mediante la
register_tick_function(). Ver el ejemplo abajo para ms detalles. Tener
en cuenta que ms de un evento puede ocurrir por cada tick.
Ejemplo #1 Ejemplo de uso del tick
<?php
declare(ticks=1);
// Una funcin llamada en cada evento tick
function tick_handler()
{
echo "tick_handler() llamado\n";
}
register_tick_function('tick_handler');

$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Ejemplo #2 Ejemplo de uso de ticks
<?php
function tick_handler()
{
echo "tick_handler() llamado\n";
}
$a = 1;
tick_handler();
if ($a > 0) {
$a += 2;
tick_handler();
print($a);
tick_handler();
}
tick_handler();
?>
Vase tambin register_tick_function() y unregister_tick_function().
Encoding
Una codificacin de script puede ser especificada para cada script
usando la directiva encoding.
Ejemplo #3 Declarando un encoding para el script
<?php
declare(encoding='ISO-8859-1');
// cdigo aqu
?>
Precaucin

Cuando se combina con espacios de nombres, la nica sintaxis legal


para declarar es declare(encoding='...'); donde ... es el valor del
encoding. declare(encoding='...') {} resultar en un error de anlisis
cuando se combina con espacios de nombres.
El valor declarado de encoding es ignorado en PHP 5.3 a menos que
php est compilado con --enable-zend-multibyte.
Tener en cuenta que PHP no expone si --enable-zend-multibyte fue
utilizado para compilar PHP que no sea por phpinfo().
Ver tambin zend.script_encoding.

return
(PHP 4, PHP 5, PHP 7)
return devuelve el control del programa al mdulo que lo invoca. La
ejecucin vuelve a la siguiente expresin despus del mdulo que lo
invoca.
Si se llama desde una funcin, la sentencia return inmediatamente
termina la ejecucin de la funcin actual, y devuelve su argumento
como el valor de la llamada a la funcin. return tambin termina la
ejecucin de una sentencia eval() o un archivo de script.
Si se llama desde el mbito global, entonces la ejecucin 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. Adems, 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 ejecucin
del script. Si el archivo script actual fue nombrado por las opciones de
configuracin auto_prepend_file o auto_append_file en php.ini,
entonces se termina la ejecucin de ese archivo script.
Para ms informacin, ver Retornando valores.
Nota: Cabe sealar que dado que return es un constructor del
lenguaje y no una funcin, los parntesis que rodean su argumentos
no son necesarios. Es comn no utilizarlos, y en realidad se debera

hacer as a fin de que PHP tenga menos trabajo que hacer en este
caso.
Nota: Si no se suministra un parmetro, entonces el parntesis debe
omitirse y NULL ser retornado. Llamadas a return con parntesis
pero sin argumentos resultarn en un error del intrprete.
Nota: Nunca se deben usar parntesis al rededor de la variable de
retorno cuando se retorna por referencia, ya que esto no funcionar.
Slo se pueden retornar variables por referencia, no el resultado de
una sentencia. Si se utiliza return ($a); entonces no se est
retornando una variable, sino el resultado de la expresin ($a) (el cual
es, por supuesto, el valor de $a).

require
(PHP 4, PHP 5, PHP 7)
require es idntico 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 slo emitir una advertencia
(E_WARNING) lo cual permite continuar el script.
Vase la documentacin de include para ms informacin.

include
(PHP 4, PHP 5, PHP 7)
La sentencia include incluye y evala el archivo especificado.
La siguiente documentacin tambin 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..

Si una ruta es definida ya sea absoluta (comenzando con una letra


de unidad o \ en Windows o / en sistemas Unix/Linux) o relativa al
directorio actual (comenzando con . o ..) el include_path ser
ignorado por completo. Por ejemplo, si un nombre de archivo
comienza con ../, el interprete buscar en el directorio padre para
encontrar el archivo solicitado.
Para ms informacin sobre como PHP maneja la inclusin de archivos
y la ruta de accesos para incluir, ver la documentacin de
include_path.
Cuando se incluye un archivo, el cdigo que contiene hereda el
mbito de las variables de la lnea en la cual ocurre la inclusin.
Cualquier variable disponible en esa lnea del archivo que hace el
llamado, estar disponible en el archivo llamado, desde ese punto en
adelante. Sin embargo, todas las funciones y clases definidas en el
archivo incluido tienen el mbito global.
Ejemplo #1 Ejemplo bsico de include
vars.php
<?php
$color = 'verde';
$fruta = 'manzana';
?>
test.php
<?php
echo "Una $fruta $color"; // Una
include 'vars.php';
echo "Una $fruta $color"; // Una manzana verde
?>
Si la inclusin ocurre al interior de una funcin dentro del archivo que
hace el llamado, entonces todo el cdigo contenido en el archivo
llamado se comportar como si hubiera sido definida dentro de esa
funcin. Por lo tanto, seguir el mbito de las variables de esa
funcin. Una excepcin a esta regla son las constantes mgicas las
cuales son evaluadas por el intrprete antes que ocurra la inclusin.
Ejemplo #2 Incluyendo dentro de funciones

<?php
function foo()
{
global $color;
include 'vars.php';
echo "Una $fruta $color";
}
/* vars.php est en el mbito de foo() as que *
* $fruta NO est disponible por fuera de ste *
* mbito. $color s est porque fue declarado *
* como global.
*/
foo();
// Una manzana verde
echo "Una $fruta $color"; // Una verde
?>
Cuando un archivo es incluido, el intrprete abandona el modo PHP e
ingresa al modo HTML al comienzo del archivo objetivo y se reanuda
de nuevo al final. Por esta razn, cualquier cdigo al interior del
archivo objetivo que deba ser ejecutado como cdigo PHP, tendr que
ser encerrado dentro de etiquetas vlidas de comienzo y terminacin
de PHP.
Si las "envolturas URL include" estn activadas en PHP, se puede
especificar el archivo a ser incluido usando una URL (va HTTP u otra
envoltura soportada - ver Protocolos y Envolturas soportados para
una lista de protocolos) en lugar de una ruta de acceso local. Si el
servidor objetivo interpreta el archivo objetivo como cdigo PHP, las
variables se pueden pasar al archivo incluido usando una string de
peticin como la usada con HTTP GET. Esto no es, en estricto rigor, lo
mismo que haber incluido el archivo y que haya heredado el mbito
de variables del archivo padre; el script realmente est siendo
ejecutado en el servidor remoto y el resultado entonces se incluye
dentro del script local.
Ejemplo #3 include por medio de HTTP
<?php
/* Este ejemplo asume que www.example.com est configurado para i
nterpretar archivos
* .php y no archivos .txt. Adems, aqu 'Funciona' quiere decir que las

variables
* $foo y $bar estn disponibles dentro del archivo incluido. */
// No funciona; file.txt no puede ser manejado por www.example.com
como PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// No funciona; busca por un archivo llamado 'file.php?foo=1&bar=2'
en el
// sistema de archivos local.
include 'file.php?foo=1&bar=2';
// Si funciona.
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Funciona.
include 'file.php'; // Funciona.
?>
Advertencia
Advertencia de seguridad
El archivo remoto puede ser procesado en el servidor remoto
(dependiendo de la extensin del archivo y del hecho de si el servidor
remoto corre PHP o no) pero aun as tiene que producir un script PHP
vlido, porque ser procesado en el servidor local. Si el archivo desde
el servidor remoto debe ser procesado all y entregar la salida
solamente, readfile() es la mejor funcin para usar. De lo contrario,
debe tenerse especial cuidado para asegurar que el script remoto
produce un cdigo vlido y deseado.
Ver tambin Archivos remotos, fopen() y file() para informacin
relacionada.
Manejando retornos: include devuelve FALSE en caso de falla y eleva
una advertencia. Inclusiones exitosas, a menos que sea reemplazado
por el archivo incluido, devolver 1. Es posible ejecutar una sentencia
return dentro de un archivo incluido con el fin de terminar el
procesamiento en ese archivo y volver a script que lo llam. Adems,
es posible retornar valores desde los archivos incluidos. Se puede
tomar el valor de la llamada "include" de la misma forma como se
hara con una funcin normal. Esto no es, sin embargo, posible si se
incluyen archivos remotos, a menos que la salida del archivo remoto
tenga unas etiquetas vlidas de inicio y terminacin de PHP (igual que

con cualquier archivo local). Se pueden declarar las variables


necesarias dentro de esas etiquetas y sern introducidas en
cualquiera sea el punto del archivo en el cual fue incluido.
Debido a que include es un constructor especial del lenguaje, los
parntesis no son necesarios en torno a su argumento. Se debe tener
cuidado cuando se compara el valor de retorno.
Ejemplo #4 Comparando el valor de retorno de include
<?php
// no funcionar, se evala como include(('vars.php') == TRUE), es de
cir, include('')
if (include('vars.php') == TRUE) {
echo 'OK';
}
// s funciona
if ((include 'vars.php') == TRUE) {
echo 'OK';
}
?>
Ejemplo #5 include y la sentencia return
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // muestra 'PHP'

$bar = include 'noreturn.php';


echo $bar; // muestra 1
?>
$bar tiene el valor 1 debido a que el include fue exitoso. Ntese la
diferencia entre los ejemplos anteriores. El primero usa return dentro
del archivo incluido, mientras que el otro no. Si el archivo no se
pueden incluir, se retorna FALSE y se emite un E_WARNING.
Si hay funciones definidas en el archivo incluido, se pueden utilizar en
el archivo principal independientemente que hayan return antes o
despus. Si el archivo se incluye dos veces, PHP 5 arrojar un error
fatal ya que las funciones ya han sido declaradas, mientras que PHP 4
no se queja acerca de las funciones definidas despus de un return.
Se recomienda el uso de include_once en lugar de comprobar si el
archivo ya estaba incluido y hacer el retorno de forma condicionada
dentro del archivo incluido.
Otra forma de "incluir" un archivo PHP en una variable es capturar la
salida mediante el uso de Funciones de control de salida con include.
Por ejemplo:
Ejemplo #6 Usando buffering de salida para incluir un archivo
PHP dentro de una cadena
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Con el fin de incluir archivos de forma automtica dentro de scripts,
vase tambin las opciones de configuracin auto_prepend_file and
auto_append_file en php.ini.

Nota: Puesto que esto es una construccin del lenguaje y no una


funcin, no puede ser llamada usando funciones variables.
Ver tambin require, require_once, include_once, get_included_files(),
readfile(), virtual() y include_path.
require_once
(PHP 4, PHP 5, PHP 7)
La sentencia require_once es idntica a require excepto que PHP
verificar si el archivo ya ha sido incluido y si es as, no se incluye
(require) de nuevo.
Ver la documentacin de include_once para informacin sobre el
comportamiento de _once, y como difiere de sus hermanos no _once.

include_once
(PHP 4, PHP 5, PHP 7)
La sentencia include_once incluye y evala el fichero especificado
durante la ejecucin del script. Tiene un comportamiento similar al de
la sentencia include, siendo la nica diferencia de que si el cdigo del
fichero ya ha sido incluido, no se volver a incluir, e include_once
devolver TRUE. Como su nombre indica, el fichero ser incluido
solamente una vez.
include_once se puede utilizar en casos donde el mismo fichero
podra ser incluido y evaluado ms de una vez durante una ejecucin
particular de un script, as que en este caso, puede ser de ayuda para
evitar problemas como la redefinicin de funciones, reasignacin de
valores de variables, etc.
Vase la documentacin de include para ms informacin sobre cmo
funciona esta funcin.
Nota:
Con PHP 4, la funcionalidad de _once difiere entre sistemas operativos
que ignoran las maysculas/minsculas (como Windows). Por
ejemplo:
Ejemplo #1 include_once con un
maysculas de minsculas en PHP 4

SO

que

no

distinque

<?php
include_once "a.php"; // esto incluir a.php
include_once "A.php"; // esto incluir a.php otra vez! (slo PHP 4)
?>
Este comportamiento cambi en PHP 5, as que, por ejemplo con
Windows primero se normaliza la ruta para que C:\PROGRA~1\A.php
sea identificado con C:\Program Files\a.php y el fichero sea incluido
slo una vez.

goto
(PHP 5 >= 5.3.0, PHP 7)

Imagen cortesa de xkcd


El operador goto puede ser usado para saltar a otra seccin en el
programa. El punto de destino es especificado mediante una etiqueta
seguida de dos puntos y la instruccin 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 funcin o mtodo, 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 comn es utilizar un
goto en lugar de un break multi-nivel.
Ejemplo #1 Ejemplo de goto
<?php
goto a;
echo 'Foo';
a:

echo 'Bar';
?>
El resultado del ejemplo sera:
Bar
Ejemplo #2 Ejemplo de goto en un bucle
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j alcanz 17';
?>
El resultado del ejemplo sera:
j alcanz 17
Ejemplo #3 Esto no funcionar
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
El resultado del ejemplo sera:
Fatal error: 'goto' into loop or switch statement is disallowed in script
on line 2
(Error fatal: 'goto' hacia el interior de un bucle o sentencia switch no
esta permitido en el script en la lnea 2)
Nota:
El operador goto est disponible a partir de PHP 5.3.

Você também pode gostar