You are on page 1of 12

UD2 Programacin baseada en linguaxes de

marcas con cdigo embebido.


1.

Estructuras de control
Todo script PHP componse dunha serie de sentenzas. Unha sentenza pode ser unha asignacin, unha chamada a funcin, un bucle, unha sentenza condicional e mesmo unha sentenza que non faga nada (unha sentenza baleira). As sentenzas normalmente acaban con
punto e coma. Ademais, as sentenzas pdense agrupar en grupos de sentenzas encapsulando un grupo de sentenzas con chaves.

1.1

if
A construcin if unha das mis importantes caractersticas de moitas linguaxes, includo
PHP. Permite a execucin condicional de fragmentos de cdigo. PHP caracteriza unha estrutura if que similar de C:
<?php
if (expr)
sentenza
?>

A expresin expr avalase ao seu valor condicional (boolean). Se expr avalase como
TRUE, PHP executar a sentenza, e se se avala como FALSE ignoraraa
O seguinte exemplo mostrara a maior que b se $a fra maior que $b:
<?php
if ($a > $b)
print "a maior que b";
?>

A mido, desxase ter mis dunha sentenza executada de forma condicional. Por suposto,
non hai necesidade de encerrar cada sentenza cunha clusula if. No canto diso, pdense
agrupar varias sentenzas nun grupo de sentenzas. Por exemplo, este cdigo mostrara a
maior que b se $a fra maior que $b, e entn asignara o valor de $a a $b:
<?php
if ($a > $b)
{
print "a maior que b";
$b = $a;
}
?>

As sentenzas if pdense aniar indefinidamente dentro doutras sentenzas if, o cal proporciona unha flexibilidade completa para execucins condicionais nas diferentes partes do
programa.

1.2

else
A mido queremos executar unha sentenza se se cumpre unha certa condicion, e unha sentenza distinta se a condicin non se cumpre. Isto para o que serve else. else estende unha
sentenza if para executar unha sentenza no caso de que a expresin na sentenza if avalese
como FALSE. Por exemplo, o seguinte cdigo mostrara a maior que b se $a fra maior
que $b, e a NON maior que b en calquera outro caso:
<?php
if ($a > $b)
{
print "a maior que b";
} else
{
print "a NON maior que b";
}
?>

A sentenza else exectase soamente se a expresin if avalase como FALSE

1.3

elseif
Como o seu nome suxire, unha combinacin de if e else. Como else, estende unha sentenza if para executar unha sentenza diferente no caso de que a expresin if orixinal avalase como FALSE. No entanto, a diferenza de else, executar esa expresin alternativa soamente se a expresin condicional elseif avalase como TRUE. Por exemplo, o seguinte
cdigo mostrara a maior que b, a igual a b ou a menor que b:
<?php
if ($a > $b)
print "a
} elseif ($a
print "a
} else {
print "a
}
?>

{
maior que b";
== $b) {
igual que b";
maior que b";

Pode haber varios elseifs dentro da mesma sentenza if. A primeira expresin elseif (se hai
algunha) que se avale como TRUE executarase. En PHP, tamn se pode escribir 'else if'
(con das palabras) e o comportamento sera idntico ao dun 'elseif' (unha soa palabra). O
significado sintctico lixeiramente distinto (se estas familiarizado con C, o mesmo
comportamento) pero a lia bsica que ambos resultaran ter exactamente o mesmo
comportamento.

1.4

Sintaxe Alternativa de Estruturas de Control

PHP ofrece unha sintaxe alternativa para algunha das sas estruturas de control; a saber,
if, while, for, e switch. En cada caso, a forma bsica da sintaxe alternativa cambiar abrirchave por dous puntos (:) e pechar-chave por endif;, endwhile;, endfor;, or endswitch;,
respectivamente.
<?php if ($a==5): ?>
A igual a 5
<?php endif; ?>

No exemplo de arriba, o bloque HTML "A igual a 5" anase dentro dunha sentenza if
escrita na sintaxe alternativa. O bloque HTML mostrarase soamente se $a fra igual a 5.
A sintaxe alternativa aplcase a else e tamn a elseif. A seguinte unha estrutura if con elseif e else no formato alternativo:
<?php
if ($a == 5):
print "a igual a 5";
print "...";
elseif ($a == 6):
print "a igual a 6";
print "!!!";
else:
print "a non nin 5 nin 6";
endif;
?>

1.5

while
Os bucles while son os tipos de bucle mis simples en PHP. Comprtanse como a sa contrapartida en C. A forma bsica dunha sentenza while :
while (expr) sentenza

O significado dunha sentenza while simple. Dille a PHP que execute a(s) sentenza(s)
aniada(s) repetidamente, mentres a expresin while avalese como TRUE. O valor da expresin comprobado cada vez ao principio do bucle, as que mesmo se este valor cambia
durante a execucin da(s) sentenza(s) aniada(s), a execucin non parar at o fin da iteracin (cada vez que PHP executa as sentenzas no bucle unha iteracin). s veces, se a
expresin while avalase como FALSE desde o principio de todo, a(s) sentenza(s) aniada(s) non se executarn nin sequera unha vez.
Como coa sentenza if, pdense agrupar multiples sentenzas dentro do mesmo bucle while
encerrando un grupo de sentenzas con chaves, ou usando a sintaxe alternativa:
while (expr): sentenza ... endwhile;

Os seguintes exemplos son idnticos, e ambos imprimen nmeros do 1 ao 10:


<?php
/* exemplo 1 */
$i = 1;
while ($i <= 10) {
print $i++; /* o valor impreso ser&iacute;a $i
antes do incremento

(post-incremento) */
}
/* exemplo 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>

1.6

do .. while
Os bucles do..while son moi similares aos bucles while, ags que as condicins comprbanse ao final de cada iteracin no canto de ao principio. A principal diferenza fronte aos
bucles regulares while que se garante a execucin da primeira iteracin dun bucle
do..while (a condicin comprbase s ao final da iteracin), mentres que pode non ser necesariamente executada cun bucle while regular (a condicin comprbase ao principio de
cada iteracin, se esta avalase como FALSE desde o principio a execucin do bucle finalizar inmediatamente).
Hai unha soa sintaxe para os bucles do..while:
<?php
$i = 0;
do {
print $i;
} while ($i>0);
?>

O bucle de arriba executarase exactamente unha soa vez, despois da primeira iteracin,
cando a condicin comprbase, avalase como FALSE ($i non mis grande que 0) e a
execucin do bucle finaliza.
Os usuarios avanzados de C poden estar familiarizados cun uso distinto do bucle
do..while, para permitir parar a execucin no medio dos bloques de cdigo, encapsulandolos con do..while(0), e usando a sentenza break. O seguinte fragmento de cdigo demostra
isto:
<?php
do {
if ($i < 5) {
print "i non o suficientemente grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
print "i correcto";
/* procesa i */

} while(0);
?>

1.7

for
Os bucles for son os bucles mis complexos en PHP. Comprtanse como a sa contrapartida en C. A sintaxe dun bucle for :
for (expr1; expr2; expr3) sentenza

A primeira expresin (expr1) avalase (executa) incondicionalmente unha vez ao principio


do bucle.
Ao comezo de cada iteracin, avalase expr2 . Se se avala como TRUE, o bucle contina
e as sentenzas aniadas exectanse. Se se avala como FALSE, a execucin do bucle finaliza.
Ao final de cada iteracin, avalase (executa) expr3.
Cada unha das expresins pode estar baleira. Que expr2 estea baleira significa que o bucle
debera correr indefinidamente (PHP implicitamente considrao como TRUE, do mesmo
xeito que C). Isto poida que non sexa tan intil como se podera pensar, posto que a mido
qurese sar dun bucle usando unha sentenza break condicional no canto de usar a condicin de for.
Considera os seguintes exemplos. Todos eles mostran nmeros do 1 ao 10:
<?php
/* exemplo 1 */
for ($i = 1; $i <= 10; $i++) {
print $i;
}
/* exemplo 2 */
for ($i = 1; ;$i++) {
if ($i > 10) {
break;
}
print $i;
}
/* exemplo 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
print $i;
$i++;
}

/* exemplo 4 */
for ($i = 1; $i <= 10; print $i, $i++) ;
?>

Por suposto, o primeiro exemplo parece ser o mais elegante (ou quizais o cuarto), pero un
pode descubrir que ser capaz de usar expresins baleiras en bucles for resulta til en moitas ocasins.
PHP tamn soporta a "sintaxe de dous puntos" alternativa para bucles for.
for (expr1; expr2; expr3): sentenza; ...; endfor;

1.8

foreach
Isto simplemente d un modo fcil de iterar sobre matrices. foreach funciona soamente
con matrices e devolver un erro se se tenta utilizar con outro tipo de datos variables non
inicializadas. Hai das sintaxe; a segunda unha extensin menor, pero til da primeira:
foreach(expresion_array as $value) sentenza
foreach(expresion_array as $key => $value) sentenza

A primeira forma percorre o array dado por expresion_array. En cada iteracin, o valor do
elemento actual asgnase a $value e o punteiro interno do array avnzase nunha unidade
(as no seguinte paso, estar a mirar o elemento seguinte).
A segunda maneira fai o mesmo, salvo que a clave do elemento actual ser asignada variable $key en cada iteracin.
Cando foreach comeza a sa primeira execucin, o punteiro interno matriz reinciase automaticamente ao primeiro elemento da matriz. Isto significa que non se necesita chamar a
reset() antes dun bucle foreach.
Hai que ter en conta que foreach traballa cunha copia da matriz especificada e non a lista
en se, por iso o punteiro da lista non modificado como na funcin each(), e os cambios
no elemento da matriz retornado non afectan ao matriz orixinal. De todas as maneiras o
punteiro interno ao matriz orixinal avanza ao procesar a matriz. supondo que bucle foreach
exectase at o final, o punteiro interno matriz estar/aacute; ao final da matriz.
foreach non soporta a caracteristica de suprimir mensaxes de erro con '@'.
As seguintes son funcionalidades idnticas:
<?php
$arr = array("one", "two", "three");
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>\n";
}
foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
?>

As seguintes tamn son funcionalidades idnticas:


<?php
reset( $arr );
while( list( $key, $value ) = each( $arr ) ) {
echo "Key: $key; Valor: $value&lt;br&gt;\n";
}
foreach( $arr as $key => $value ) {
echo "Key: $key; Valor: $value&lt;br&gt;\n";
}
?>
Algns exemplos mis para demostrar o seu uso:
<?php
/* foreach exemplo 1: s&oacute;o valor*/
$a = array(1, 2, 3, 17);
foreach($s $v) {
print "Valor actual de \$a: $v.\n";
}
/* foreach exemplo 2: valor (con clave impresa para ilustrar)
*/
$a = array(1, 2, 3, 17);
$i = 0; /* s&oacute;o para prop&oacute;sitos demostrativos */
foreach($s $v) {
print "\$a[$i] => $v.\n";
$i++;
}
/* foreach exemplo 3: clave e valor */
$a = array(
"un" => 1,
"dous" => 2,
"tres" => 3,
"dezasete" => 17
);
foreach($s $k => $v) {
print "\$a[$k] => $v.\n";
}
/* foreach exemplo 4: matriz multi-dimensional */
$a[0][0] = "a";
$a[0][1] = "b";

$a[1][0] = "e";
$a[1][1] = "z";
foreach($s $v1) {
foreach ($v1 as $v2) {
print "$v2\n";
}
}
/* foreach exemplo 5: matriz din&aacute;mica */
foreach(array(1, 2, 3, 4, 5) as $v) {
print "$v\n";
}
?>

1.9

break
break escapa das estruturas de control iterante (bucle) actuais for, while, ou switch.
break acepta un parmetro opcional, o cal determina cantas estruturas de control hai que
escapar.
<?php
$arr = array ('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each ($arr)) {
if ($val == 'stop') {
break;
/* Poderase escribir 'break 1;' */
}
echo "$val<br>\n";
}
/* Usando o argumento opcional. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br>\n";
break 1; /* Sale s do switch. */
case 10:
echo "Ao 10; sando<br>\n";
break 2; /* Sale do switch e do bucle. */
default:
break;
}
}
?>

1.10 continue
continue sase dentro da estrutura do bucle para saltar o resto da iteracin actual do bucle
e continuar a execucin ao comezo da seguinte iteracin.
continue accepta un parmetro opcional, o cal determina cuantos niveles (bluces) hai que
saltar antes de continuar coa execucin.
<?php
while (list ($key, $value) = each ($arr)) {
if (!($key % 2)) { // skip odd members
continue;
}
do_something_odd ($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer<br>\n";
while (1) {
echo "&nbsp;&nbsp;Middle<br>\n";
while (1) {
echo "&nbsp;&nbsp;Inner<br>\n";
continue 3;
}
echo "Isto nunca se imprime.<br>\n";
}
echo "E isto tampouco.<br>\n";
}
?>

1.11 switch
A sentenza switch similar a unha serie de sentenzas IF na mesma expresin. En moitas
ocasins, qurese comparar a mesma variable (ou expresin) con nuchos valores diferentes, e executar unha parte de cdigo distinta dependendo da que valor igual. Para iso serve a sentenza switch.
Os seguintes dous exemplos son dous modos distintos de escribir a mesma cousa, un usa
unha serie de sentenzas if, e o outro usa a sentenza switch:
<?php
if ($i == 0) {
print "i equals 0";
} elseif ($i == 1) {
print "i equals 1";
} elseif ($i == 2) {
print "i equals 2";
}
switch ($i) {
case 0:

print "i equals 0";


break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
}
?>

importante entender como se executa a sentenza switch para evitar erros. A sentenza
switch executa lia por lia (realmente, sentenza a sentenza). Ao comezo, non se executa
cdigo. S cando se atopa unha sentenza case cun valor que coincide co valor da expresin switch PHP comeza a executar as sentenzas. PHP contina executando as sentenzas
at o final do bloque switch, ou a primeira vez que vexa unha sentenza break. Se non se
escribe unha sentenza break ao final dunha lista de sentenzas case, PHP seguir executando as sentenzas do seguinte case. Por exemplo:
<?php
switch ($i) {
case 0:
print "i igual a 0";
case 1:
print "i igual a 1";
case 2:
print "i igual a 2";
}
?>

Aqu, se $i igual a 0, PHP executara todas as sentencias print! Se $i igual a 1, PHP


executara as ltimas das sentenzas print e s se $i igual a 2, obterase a conduta 'esperada' e soamente mostrarase 'i igual a 2'. As, importante non esquecer as sentenzas
break (mesmo anda que poida querer evitar escribilas intencionadamente en certas circunstancias).
Nunha sentenza switch, a condicin avalase s unha vez e o resultado comprase a cada
sentenza case. Nunha sentenza elseif, a condicin avalase outra vez. Se a ta condicin
mis complicada que unha comparacin simple e/ou est nun bucle estreito, un switch pode ser mis rpido.
A lista de sentenzas dun case pode tamn estar baleira, o cal simplemente pasa o control
lista de sentenzas do seguinte case.
<?php
switch ($i) {
case 0:
case 1:
case 2:
print "i menor que 3, pero non negativo";
break;
case 3:
print "i 3";

}
?>

Un caso especial o default case". Este "case" coincide con todo o que non coincidan os
outros case. Por exemplo:
<?php
switch ($i) {
case 0:
print "i
break;
case 1:
print "i
break;
case 2:
print "i
break;
default:
print "i
}
?>

igual a 0";

igual a 1";

igual a 2";

non igual a 0, 1 ou 2";

A expresin case pode ser calquera expresin que se avale a un tipo simple, dicir, nmeros enteiros ou de punto flotante e cadeas de texto. Non se poden usar aqu nin arrays
nin obxectos a menos que se convertan a un tipo simple.
A sintaxe alternativa para as estruturas de control est tamn soportada con switch. Para
mis informacin, ver Sintaxe alternativa para estruturas de control.
<?php
switch ($i):
case 0:
print "i
break;
case 1:
print "i
break;
case 2:
print "i
break;
default:
print "i
endswitch;
?>

igual 0";

igual a 1";

igual a 2";

non igual a 0, 1 ou 2";

1.12 return
Se se chama desde unha funcin, return() termina inmediatamente a execucin da funcin
e retorna o seu argumento como valor da funcin. return() tamn terminar a execucin
dunha sentenza eval() ou un script PHP.

Ter en conta que xa que return() un construtor da linguaxe e non unha funcin, o parntese ao redor dos seus argumentos, son s necesarios se o argumento contn unha expresion, non se adoitan utilizar tan a mido, cando retornan unha variable.

You might also like