Académique Documents
Professionnel Documents
Culture Documents
Cdigo 10FP32CF148
CEFIRE Especfico de FP
ndice de contenidos
1 - Presentacin de la Sesin.......................................................................................5 2 - Sintaxis Bsica.........................................................................................................6 3 - Comentarios ............................................................................................................7 4 - Instrucciones (Mi primer programa).........................................................................7 4.1 - Variables e Identificadores................................................................................8 4.2 - Operadores........................................................................................................9 4.2.1 - Operadores aritmticos...........................................................................10 4.2.2 - Operadores de asignacin......................................................................10 4.2.3 - Operadores de comparacin...................................................................11 4.2.4 - Operadores lgicos.................................................................................11 4.2.5 - Operadores Bit a Bit................................................................................12 4.2.6 - Operadores de incremento/decremento..................................................13 4.2.7 - Operador ternario....................................................................................14 4.2.8 - Operador de supresin o de control de error..........................................14 4.2.9 - Operador de ejecucin............................................................................14 4.2.10 - Operador de tipo....................................................................................15 4.2.11 - Operadores de matrices........................................................................15 5 - Tipos De Datos.......................................................................................................16 5.1 - Tipos Escalares...............................................................................................16 5.1.1 - bolean (booleano)....................................................................................16 5.1.2 - integer (Entero)........................................................................................16 5.1.3 - float (nmero real de punto-flotante, conocido como 'double')...............16 5.1.4 - String (Cadena de caracteres)................................................................17 5.2 - Tipos compuestos............................................................................................20 5.2.1 - array.........................................................................................................20 5.2.2 - object ......................................................................................................20 5.3 - Tipos especiales..............................................................................................20 5.3.1 - resource ..................................................................................................20 5.3.2 - null...........................................................................................................20 5.4 - Pseudo-tipos....................................................................................................20 5.4.1 - mixed.......................................................................................................20 5.4.2 - number.....................................................................................................20
CEFIRE Especfico FP
6 - Conversin De Tipos..............................................................................................21 7 - Variables De Variable............................................................................................21 8 - Declarar Y Utilizar Constantes...............................................................................22 9 - Probar El Estado De Variables..............................................................................23 10 - mbito De Variables............................................................................................24 11 - Entrada y Salida de datos bsica........................................................................26 11.1 - Salida.............................................................................................................26 11.2 - Entrada desde el terminal..............................................................................26 11.2.1 - Entrada desde un navegador................................................................27 12 - Bloques de Instrucciones.....................................................................................29 13 - Estructuras De Control.........................................................................................29 13.1 - Instruccin if...................................................................................................29 13.2 - Instruccin else..............................................................................................30 13.3 - Instruccin elseif............................................................................................30 13.4 - Estructuras Repetitivas o Bucles...................................................................31 13.4.1 - Nociones Bsicas..................................................................................31 13.4.2 - Bucle while.............................................................................................32 13.4.3 - Bucle dowhile.....................................................................................33 13.4.4 - Bucle for.................................................................................................34 13.4.5 - Bucle foreach.........................................................................................35 13.4.6 - break......................................................................................................36 13.4.7 - continue.................................................................................................36 13.5 - Condicional switch.........................................................................................37 14 - Anexo I - Esquemas algortmicos bsicos...........................................................39 14.1 - Contador........................................................................................................39 14.2 - Acumulador (Similar a contador)...................................................................39 14.3 - Switch (interruptor, tambin conocido como flag).........................................39 15 - Bibliografa...........................................................................................................40
-4-
1 - PRESENTACIN DE LA SESIN
Al desarrollar estas caractersticas bsicas no pretendemos hacer un manual de referencia de PHP indicado en la bibliografa. Pero si que se recogen las caractersticas y funcionalidades principales para empezar a desarrollar aplicaciones haciendo uso de su potencial principal. Para aquellos que lleven tiempo sin programar o quieran empezar desde cero se van a incluir algunas nociones bsicas de programacin que se completarn a travs de un apndice en el bloque.
Para aquellos que tengan experiencia programando en lenguajes c omo C, C++, JavaScript, C#, Java, etc... este bloque pueden leerlo de forma rpida y saltar la gran mayora de aspectos bsicos de programacin, sin embargo este material se ha incluido ya que puede ser de utilidad para nuestro alumnado.
-5-
CEFIRE Especfico FP
2 - SINTAXIS BSICA
Php simplemente interpreta el texto del archivo de cdigo con extensin .php hasta que encuentra uno de los caracteres especiales que delimitan el inicio de cdigo php. <?php cdigo en php ?>
<?php if ($expression) { ?> <b>Cierto.</b> <?php } else { ?> <b>Falso.</b> <?php } ?>
Como vemos en el ejemplo el cdigo php no tiene por que estar en un solo bloque de delimitadores. Todo el cdigo fuera es interpretado tal cual por php. Podremos encontrar cdigo con otros delimitadores, incluso se pueden configurar en el php.ini. Pero si no usamos estos podemos tener problemas al embeber cdigo php dentro de XML o XHTML. Cualquier tipo de espacio en blanco como saltos de lnea, tabuladores y espacio. Son ignorados por php puesto que tambin son ignorados por los navegadores en el cdigo HTML.
-6-
3 - COMENTARIOS
Los comentarios del cdigo se podrn realizar usando los siguientes delimitadores De bloque: /* ...comentario */ (Como en C99) De lnea: // ...comentario de una sola lnea. (Como en C99) # ...comentario de una sola lnea. (Como en Shell Script)
Deberemos tener cuidado de no anidar cdigo comentado y de no comentar cdigo fuera de los delimitadores <?php ?>, puesto que no tendrn ningn efecto. Un comentario debe MERECER LA PENA y tiene que indicar de forma clara y concisa qu es lo que hace una seccin del cdigo de un algoritmo, y no cmo lo hace (para eso ya est el propio cdigo).
primero.php Supongamos que el script del ejemplo se encuentra en un fichero llamado primero.php. Para ejecutarlo podremos abrirlo desde un navegador haciendo una peticin al servidor Apache o ejecutarlo desde un terminal mediante el comando:
$ php primero.php
-7-
CEFIRE Especfico FP
-8-
4.2 - Operadores
En PHP los operadores y la evaluacin de expresiones son muy similares a las del lenguaje C. Deberemos tener claro a que tipo se van a evaluar y cual es la precedencia y asociatividad de los operadores con misma precedencia. A grandes rasgos podemos decir que tendremos 2 tipos de expresiones: Las que se evalan a algn valor escalar o cadena. Las que se evalan a un valor booleano de cierto o falso (usan operadores lgicos y comparaciones).
En primer lugar vamos a ver una tabla con la asociatividad y prioridad de los operadores, esta ltima de mayor a menor: Asociatividad no-asociativo no-asociativo derecha a izquierda no-asociativos no-asociativos izquierda a derecha izquierda a derecha izquierda a derecha no-asociativos no-asociativos izquierda a derecha izquierda a derecha izquierda a derecha izquierda a derecha izquierda a derecha izquierda a derecha derecha a izquierda izquierda a derecha izquierda a derecha izquierda a derecha izquierda a derecha Operadores
() new [] ++ -! ~ - (int) (float) (string) (array) (object) @ * / % + - . << >> < <= > >= == != === !== & ^ | && || ? : = += -= *= /= .= %= &= |= ^= <<= >>= and xor or ,
Por ejemplo 1 + 4 * 5 se evaluar a 21 y no a 25, para evaluarse a 25 deberamos poner parntesis (1 + 4) * 5 Vamos a clasificar estos operadores segn el tipo de operacin...
-9-
CEFIRE Especfico FP
El operador de divisin '/' devuelve un valor flotante en todos los casos, incluso si los dos operandos son enteros. Con lo cual evitaremos el problema de la divisin entera donde 3 * 4 / 7 se evaluaba a 0. El resto de $a % $b es negativo para valores negativos de $a.
- 10 -
- 11 -
Evala $a = 4 % 2 > 3 && 3 * 4 / 2 == 5 + 1 || !(6 <= 6) && true; paso a paso teniendo en cuenta la precedencia de los operadores. $a $a $a $a $a $a $a $a $a $a $a $a = = = = = = = = = = = = 4 % 2 > 3 && 3 * 4 / 2 == 5 + 1 || !(6 <= 6) && true; 4 % 2 > 3 && 3 * 4 / 2 == 5 + 1 || !true && true; 4 % 2 > 3 && 3 * 4 / 2 == 5 + 1 || false && true; 0 > 3 && 3 * 4 / 2 == 5 + 1 || false && true; 0 > 3 && 12 / 2 == 5 + 1 || false && true; 0 > 3 && 6 == 5 + 1 || false && true; 0 > 3 && 6 == 6 || false && true; false && 6 == 6 || false && true; false && true || false && true; false || false && true; false || false; false;
- 12 -
PHP sigue la convencin de Perl cuando trabaja con operaciones aritmticas sobre variables de caracter, y no la convencin de C. Por ejemplo, en Perl 'Z'+1 se convierte en 'AA', mientras que en C 'Z'+1 se convierte en '[' ( ord('Z') == 90, ord('[') == 91 ). Note que las variables de caracter pueden ser incrementadas pero no decrementadas.
$a = 3; $b = 7; $cadena = 'AB'; echo "Sean a = $a, b = $b y cadena='$cadena'<br>"; $c = --$a + $b++; // Por prioridad primero se hacen los incrementos y decrementos. // Por lo que $c = 2 + 7 con $a = 2 y $b = 8; echo "--a + b++ = $c<br>Con b = $b y a = $a<br>"; ++$cadena; echo "++cadena = '$cadena'"; // Imprime: ++cadena = 'AC'
- 13 -
CEFIRE Especfico FP
Nota: Aunque este operador es muy til y ahorra lneas de cdigo, no conviene usar este operador como sustituto de if-else, ni en expresiones complejas, ya que puede dar lugar a cdigo ofuscado.
$c=($a>0&&$b<=10)?++$a*$b:$a/$b; // Cdigo ofuscado.
Nota: Si la configuracin track_errors est habilitada en el PHP.INI, cualquier mensaje de error generado por la expresin ser almacenado en la variable global $php_errormsg. Esta variable ser sobrescrita en cada ocurrencia de error.
- 14 -
- 15 -
CEFIRE Especfico FP
5 - TIPOS DE DATOS
Puesto que en php no hace falta declarar variables, se puede decir que php es un lenguaje dbilmente tipado, puesto que es el intrprete decide el tipo de una variable en el momento de utilizarla dependiendo del valor que tenga guardado en ese momento. Tendremos dos funciones especiales para gestionarlos: 1 Para volcar el tipo y el contenido de una variable: void var_dump ( mixed expresion [, mixed expresion [, ...]]) 2 Para saber el tipo: string gettype ( mixed var) 3 Para forzar un tipo: int settype ( string var, string type) PHP soporta ocho tipos primitivos.
- 16 -
Como vemos podremos meter saltos de lnea aunque despus son ignorados y cualquier carcter es interpretado tal cual, salvo los siguientes caracteres de escape vlidos: \' Comilla simple. \\ Barra Invertida. Entre comillas dobles: Permite expandir el contenido de una variable dentro de la cadena.
Algunos autores lo consideran una mala prctica definir literales de cadena entre comillas dobles cuando estas no son necesarias, puesto que tardan ms en interpretarse perdiendo as eficiencia. Adems en ocasiones se har complicado consultar el valor de la variable.
Nos permitirn ampliar el nmero de caracteres de escape vlidos. \n Nueva lnea \r Salto de carro \t Tabulacin \\ Barra invertida \$ Signo dlar \" Comillas dobles \xFF Valor haxadecimal.
$mes = 'septiembre'; // Imprime: Ahora viene un salto de lnea. Ahora expandimos 'septiembre' echo "Ahora hay un salto de lnea.\nAhora expandimos '$mes'"; $valor = 400; // Imprime: Son 400$ Caracter guion bajo _ echo "Son $valor\$ Caracter guion bajo \x5F";
- 17 -
Esta sintaxis viene del lenguaje Perl y nos permite definir cadenas extensas de forma elegante. Tendr la siguiente sintaxis. $texto = <<<marcador linea 1 linea 2 marcador
$valor = 400; /* Imprime: Esto es la primera lnea. El "precio" es de 400$ */ echo <<<FIN Esto es la primera lnea. El "precio" es de $valor\$ FIN
El marcador es arbitrario, no debe aparecer en el texto y debe seguir las reglas de nomenclatura de los identificadores. Adems para que cierre correctamente debe aparecer en la primera columna sin ningn tipo de sangra. Las variables tambin son expandidas como ocurre con las comillas dobles.
- 18 -
Como adelanto a la gestin de cadenas, vamos a hablar del operador de concatenacin que es el carcter punto '.'. Este operador nos permitir crear literales de cadena y darles formato junto a variables sin necesidad de expandir sus valores. Si en la expresin de concatenacin ponemos una variable que no es de tipo string, tratar de convertirla a cadena para realizar la concatenacin.
$nombre = 'Juan; echo "Hola $nombre"; // Imprime: Hola Juan echo 'Hola '.$nombre; // Equivalente a lo anterior concatenando.
No se podrn concatenar literales numricos. Expandir expresiones complejas En ciertos casos cuando expandamos variables necesitaremos utilizar las llaves { expresin compleja }. Todo lo que est entre llaves se considerar como si no formase parte de la cadena y ser interpretado y expandido dentro de la misma.
$precio = 400; // El smbolo de lo toma como parte del identificador. echo "El precio es de $precio"; // No puede haber espacios entre las llaves. echo "El precio es de { $precio}"; // Forma correcta. echo "El precio es de {$precio}"; //Imprime: El precio es de 400 // Forma ms correcta. echo 'El precio es de '.$precio.''; //Imprime: El precio es de 400
Las llaves es conveniente utilizarlas si vamos a acceder a un campo indexado dentro de una array o si accedemos al atributo de algn objeto etc como veremos ms adelante.
- 19 -
CEFIRE Especfico FP
5.2.2 - object
Utilizado para almacenar instancias de clases. (Las trataremos ms adelante).
5.3.2 - null
Toman este valor variables no definidas o las que no se les ha asignado nada. As como a las que se le asigna null de forma literal.
5.4 - Pseudo-tipos
Introducidos por razones de legibilidad y aplicados a parmetros de funciones.
5.4.1 - mixed
Indica que un parmetro puede aceptar mltiples tipos (no necesariamente todos).
5.4.2 - number
Indica que un parmetro puede ser integer o float.
- 20 -
6 - CONVERSIN DE TIPOS
Al realizar operaciones entre tipos diferentes se realizar una conversin implcita al tipo de mayor rango. En php tenemos la posibilidad de realizar conversiones explcitas entre tipos. Una forma es utilizando la sintaxis del cast explcito del lenguaje C. $var1 = (tipo)$var2;
$varEntera = 3; $varReal = (double)$varEntera;
Deberemos tener cuidado al hacer este tipo de conversiones pues puede dar lugar a resultados inesperados. Para profundizar en el comportamiento deberemos consultar el manual oficial de php. Tambin tendremos la posibilidad de reinterpretar variables, utilizando funciones de utilidad como: int intval ( mixed var [, int base]) double doubleval ( mixed var) string strval ( mixed var) Obtiene una valor entero. Obtiene una valor double. Obtiene una cadena.
7 - VARIABLES DE VARIABLE
PHP nos permite cambiar el nombre de una variable de forma dinmica. Su funcionamiento consiste en utilizar el valor de una variable como nombre de otra.
$valor = 400; $nombreVar= 'valor'; $$nombreVar = 200; echo "$valor = {$$nombreVar}";
Por ejemplo si tenemos $nombreVar = valor .. $$nombreVar = 400 equivale ha hacer $valor = 400. Puede ser til por ejemplo para ir enumerando las variables de un formulario con un bucle, pero no conviene abusar de ellas pues pueden dar lugar a cdigo ofuscado.
- 21 -
CEFIRE Especfico FP
Su uso es interesante pues auto-documenta el cdigo y evita la aparicin de nmeros mgicos en el mismo. 1. Las constantes no necesitan anteponer el smbolo $ como las variables para ser referenciadas en el cdigo. 2. Las constantes no se pueden expandir en literales de cadena con doble comilla. Disponemos de la funcin array get_defined_constants ( void ) para ver todas las constantes definidas y tambin podemos usar int phpinfo( void ) para visualizar todas las constantes que tenemos ya predefinidas para nuestra configuracin de PHP, segn las extensiones que tengamos cargadas.
- 22 -
- 23 -
CEFIRE Especfico FP
10 - MBITO DE VARIABLES
El mbito de una variable es el contexto dentro del que la variable est definida. Veamos que casos de mbito se pueden dar en PHP (Tendremos un ejemplo de cdigo donde se indica cada uno en la siguiente pgina): 1. Las constantes, una vez declaradas, siempre resultan visibles de forma global y se pueden usar dentro y fuera de funciones. 2. Las variables globales dentro de la secuencia de comandos son visibles en toda la secuencia de comandos pero no dentro de las funciones. 3. Las variables locales a funciones tienen restringido su mbito a la funcin y dejan de existir cuando esta finaliza. 4. Las variables estticas locales a funciones tienen restringido su mbito a la funcin pero conservan su valor entre las ejecuciones de esta. (Lenguaje C) 5. Las variables globales locales a funciones hacen referencia a una variable global con mismo nombre o identificador. 6. Las variables superglobales son variables predefinidas en PHP y son visibles en toda la secuencia de comandos incluido el interior de las funciones. Aunque vamos a mencionar a continuacin profundizaremos en algunas de ellas a lo largo del curso. a. $GLOBALS Matriz con todas las variables globales, puede servirnos para acceder a una variable global dentro de una funcin sin tener que declararla como global local a funcin. b. $_SERVER Matriz con variables definidas por el servidor web directamente relacionadas con el entorno en don el script se esta ejecutando. c. $_GET Matriz con variables proporcionadas al script por medio de GET. d. $_POST Matriz con variables proporcionadas al script por medio de POST. e. $_COOKIE Matriz con la variables de cookies. f. $_FILES Matriz con variables relacionadas con la carga de archivos. g. $_ENV Matriz con variables de entorno.
- 24 -
h. $_REQUEST Matriz con todas las variables de entrada del usuario ($_GET, $_POST, $_COOKIE). Cuando se utiliza la linea de comandos, argv y argc no son incluidas aqu. i. $_SESSION Matriz con las variables registradas en la sesin del script. Supongamos que nos pasan con un HTTP GET la variable precio http://www.ejemplo.com/ejemplo.php?precio=200 accederemos al valor de precio de la siguiente forma:
echo 'El precio es: '.$_GET['precio'];
Veamos un ejemplo comentado donde vemos los diferentes casos de mbito expuestos con anterioridad:
<?php // Definicin constante define('CONSTANTE',3.1416); // Variables globales $globalA = 100; $globalB = 200; // Funcin prueba function Prueba() { // Accederemos a la variable global globalA. global $globalA; // Variable local su desaparece al terminar la funcin // se le asigna el valor 300 en cada llamada. $localA = 300; // Variable local esttica su valor permanece al terminar la // funcin. Slo se asigna el valor 400 en la primera llamada. static $localB = 400; $localA++; $localB++; // Acceso echo echo echo echo echo echo echo } desde el mbito de la funcin. 'Dentro del mbito de la funcin prueba<br>'; "globalA = $globalA<br>"; // Vlido caso 5 "globalB = $globalB<br>"; // Invlido caso 2 "sglobalB = {$GLOBALS['globalB']}<br>"; // Vlido caso 6 "localA = $localA<br>"; // Vlido caso 3 "localB = $localB<br>"; // Vlido caso 4 'CONSTANTE = '.CONSTANTE.'<br>'; // Vlido caso 1
Prueba(); // Tras la llamada $localB mantiene el valor incrementado. Prueba(); // Acceso desde el mbito de la secuencia de comandos echo 'Dentro del mbito de la secuencia de comandos global<br>'; echo "globalA = $globalA<br>"; // Vlido caso 2 echo "globalB = $globalB<br>"; // Vlido caso 2 echo "sglobalB = {$GLOBALS['globalB']}<br>"; // Vlido caso 6 echo "localA = $localA<br>"; // Invlido caso 3 echo "localB = $localB<br>"; // Invlido caso 4 echo 'CONSTANTE = '.CONSTANTE.'<br>'; // Vlido caso 1 ?>
- 25 -
CEFIRE Especfico FP
11.1 - Salida
Ya hemos visto durante la explicacin del tipo string, la salida la podemos hacer con el comando echo seguido de un espacio y una cadena de caracteres ya sea un literal, una variable o un conjunto de ambas. Lo que deberemos formatear es texto que entienda el navegador que utilicemos como cliente. Este comando funcionar tambin para scripts ejecutados desde un terminal.
La instruccin $dato1 = trim(fgets($stdin, 1000)); parar la ejecucin del script hasta que el usuario introduzca algo por el terminal y pulse retorno de carro, momento en el cual continuar la ejecucin y la variable $dato1 tomar el valor introducido. El tipo de la variable $dato1 ser asignado segn lo que introduzcamos.
- 26 -
Ejemplo
http://localhost/script.php?nombre=Juanjo&edad=38
Fijmonos que tras el nombre del fichero o script que vamos a ejecutar se pone el carcter ? y tras el los diferentes datos que queremos pasarle al script separados por el carcter &. En el script podremos acceder al valor del nombre a travs de la variable superglobal $_GET con la sintaxis $_GET['dato1'] como ya hemos comentado. Ejemplo
$_GET['nombre'] se evaluar a la cadena "Juanjo" y $_GET['edad'] se evaluar al entero 38.
Si lo que queremos es hacerlo a travs de un formulario tendremos que utilizar un cdigo similar al siguiente:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head></head> <body> <?php if (isset($_GET['aceptar'])===true) { // Aqu aadiremos las lneas de cdigo de nuestro programa y // accedereamos a los datos usando $_GET echo "El dato1 es {$_GET['dato1']}<br/>"; echo "La dato2 es {$_GET['dato2']}<br/>"; } else { ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="get"> dato1:<input name="dato1" value="" type="text"><br/> dato2:<input name="dato2" value="" type="text"><br/> <!-- Aqu aadiremos ms datos entrada de forma anloga --> <input name="aceptar" value="Aceptar" type="submit"> </form> <?php } ?> </body> </html>
- 27 -
CEFIRE Especfico FP
Tras introducir los datos y pulsar aceptar se ejecutar la parte que accede a los datos introducidos.
Si nos fijamos bien en la parte de la direccin se genera un QUERY_STRING con los datos introducidos tal y como hemos descrito. La desventaja de este mtodo frente a la introduccin en la ejecucin desde el terminal es que los datos se deben meter todos de una vez y de forma previa a la ejecucin.
- 28 -
12 - BLOQUES DE INSTRUCCIONES
Llamaremos bloque de instrucciones al conjunto de varias instrucciones seguidas delimitadas entre dos llaves. Ejemplo
{ echo 'Hola '; echo 'caracola'; }
13 - ESTRUCTURAS DE CONTROL
Permiten controlar el flujo de ejecucin de sentencias y se pueden agrupar en condicionales (o de bifurcacin) y en estructuras de repeticin o bucles. Los programadores de lenguaje C no tendrn ningn problema pues son muy similares a las de dicho lenguaje.
Como nomenclatura cuando nos refiramos a sentencia haremos referencia a una asignacin, una llamada a funcin, un bucle, una sentencia condicional e incluso una sentencia que no haga nada (una sentencia vaca). Adems, las sentencias se pueden agrupar en grupos de sentencias encapsulando un grupo de sentencias con llaves. A esto ltimo lo denominaremos bloque de sentencias.
13.1 - Instruccin if
if (expresin) sentencia; if (expresin) { bloque; }
Permite la ejecucin condicional de fragmentos de cdigo. expresin se evala a su valor condicional (boolean). Si Expr se evala como TRUE, PHP ejecutar la sentencia o bloque de sentencias, y si se evala como FALSE la ignorar.
// $dato toma un valor aleatorio $dato = 23; if ($dato == true) echo 'Dato es cierto'; if ($dato === true) echo 'Dato es cierto';
Si observamos el cdigo de ejemplo $dato no contiene un valor booleano puesto que se inicializa a un valor aleatorio. Sin embargo al usar == la expresin se evaluar a cierto. Hubiese dado igual poner if ($dato) Esto puede ser fuente de errores, por tanto en PHP utilizaremos el operador ===. - 29 -
CEFIRE Especfico FP
A menudo queremos ejecutar una sentencia si se cumple una cierta condicin, y una sentencia distinta si la condicin no se cumple. Esto es para lo que sirve else. else extiende una sentencia if para ejecutar una sentencia en caso de que la expresin en la sentencia if se evale como FALSE.
elseif, como su nombre sugiere, es una combinacin de if y else. Como else, extiende una sentencia if para ejecutar una sentencia diferente en caso de que la expresin if original se evala como FALSE. No obstante, a diferencia de else, ejecutar esa expresin alternativa solamente si la expresin condicional elseif se evala como TRUE. Ejemplo
Se nos pide hacer un script de terminal en php que lea dos valores numricos X e Y, determine si son iguales y, en caso de no serlo, indique cul de ellos es el mayor.
Solucin
<?php $stdin = fopen('php://stdin', 'r'); echo $X = echo $Y = 'X? '; trim(fgets($stdin,1000)); 'Y? '; trim(fgets($stdin,1000)); == $Y) 'Son iguales'; ($X > $Y) 'X es mayor que Y'; 'Y es mayor que X';
fclose($stdin); ?>
- 30 -
verdadero
condicin
falso
verdadero
condicin
falso
Repeticin con condicin con contador Diseo de un bucle: Qu instrucciones contiene el bucle? Cuantas veces se deben repetir? Errores: Deberemos llevar especial cuidado en evitar situaciones de BUCLE INFINITO. - 31 -
CEFIRE Especfico FP
Le dice a PHP que ejecute la(s) sentencia(s) repetidamente, mientras la expresin while se evale como TRUE. El valor de la expresin es comprobado cada vez al principio del bucle, as pues en alguna iteracin (cada vez que PHP ejecuta las sentencias en el bucle es una iteracin) del bucle deberemos cambiar los valores de expresin para que se evalu a FALSE, de lo contrario entraramos en un bucle infinito.1 Ejemplo
Veamos el siguiente ejemplo que genera cdigo HTML para visualizar una tabla de pares hasta el nmero 100.
<table width="20%" border="1" cellspacing="0"> <tr> <td> <b>Pares</b> </td> </tr> <?php $num = 0; while ($num <= 100) { if($num % 2 == 0) { echo '<tr>'; echo '<td>'.$num.'</td>'; echo '</tr>'; } $num++; } ?> </table>
Como se puede apreciar en el ejemplo, podemos combinar ms de una estructura de seleccin como en el resto de lenguajes estructurados.
1Ver Anexo I - 32 -
Los bucles dowhile son muy similares a los bucles while, excepto que las condiciones se comprueban al final de cada iteracin en vez de al principio. La principal diferencia frente a los bucles regulares while es que se garantiza la ejecucin de la primera iteracin. Ejemplo
Veamos el siguiente ejemplo que genera cdigo HTML para visualizar una tabla de pares hasta el nmero 100.
<table width="20%" border="1" cellspacing="0"> <tr> <td> <b>Pares</b> </td> </tr> <?php $num = 0; do { if($num % 2 == 0) { echo '<tr>'; echo '<td>'.$num.'</td>'; echo '</tr>'; } $num++; } while ($num < 100); ?> </table>
- 33 -
CEFIRE Especfico FP
La primera expresin (expresin1) se evala (ejecuta) incondicionalmente una vez al principio del bucle. Al comienzo de cada iteracin, se evala expresin2. Si se evala como TRUE, el bucle contina y las sentencias anidadas se ejecutan. Si se evala como FALSE, la ejecucin del bucle finaliza. Al final de cada iteracin, se evala (ejecuta) expresin3. Ejemplo
Veamos el siguiente ejemplo que genera cdigo HTML para visualizar una tabla de pares hasta el nmero 100.
<table width="20%" border="1" cellspacing="0"> <tr> <td> <b>Pares</b> </td> </tr> <?php for ($num = 0; $num <= 100; $num++) { if($num % 2 == 0) { echo '<tr>'; echo '<td>'.$num.'</td>'; echo '</tr>'; } } ?> </table>
- 34 -
Pueden faltar alguna o todas las expresiones, pero deben permanecer los signos de punto y coma. Ejemplos:
$i=1; $suma=0; for ( ; $i<=10; ++$i) $suma += $i; // Es equivalente a: $i=1; $suma=0; for ( ; $i<=10 ; ) $suma += $i++;
Cuando falta la expresin2, se le supone valor verdadero siempre, formndose un ciclo sin salida. Ejemplo:
for (;;) echo 'Esto es un bucle infinito.';
- 35 -
CEFIRE Especfico FP
13.4.6 - break
Se utiliza: Para forzar la salida inmediata de un bucle, saltando la evaluacin condicional normal. Para terminar una clusula "case" de sentencia "switch" y finalizar su ejecucin. Ejemplo
Programa que va calculando la raz cuadrada de un nmero introducido, mientras este no sea negativo.
<?php $stdin = fopen('php://stdin', 'r'); while (true) { echo 'Introduce un nmero entero? '; $numero = trim(fgets($stdin,1000)); if ($numero < 0.0) break; $raiz = sqrt($numero); echo "La raz cuadrada de $numero es $raiz"; } fclose($stdin); ?>
No conviene abusar de esta instruccin pues en ocasiones puede hacer que nos dejemos algn tipo de recurso sin cerrar o liberar.
13.4.7 - continue
continue se usa dentro de la estructura del bucle para saltar el resto de la iteracin actual del bucle y continuar la ejecucin al comienzo de la siguiente iteracin. continue accepta un parmetro opcional, el cual determina cuantos niveles (bluces) hay que saltar antes de continuar con la ejecucin.
Ejemplo
Programa que le 10 nmeros y los va mostrando si no coincide el nmero introducido con el 0.
<?php $stdin = fopen('php://stdin', 'r'); for (int i = 0; i < 10; ++i) { echo 'Introduce un numero? '; $numero = trim(fgets($stdin,1000)); if ($numero == 0) continue; echo $numero; } fclose($stdin); ?>
- 36 -
La sentencia switch es similar a una serie de sentencias if en la misma expresin. En muchas ocasiones, se quiere comparar la misma variable (o expresin) con muchos valores diferentes, y ejecutar una parte de cdigo distinta dependiendo de a qu valor es igual. Su sintaxis ms comn en como se muestra en el recuadro donde expresin se evaluar a un tipo nico simple entero, double, cadena etc y literal1, literal2 son literales de ese tipo. default se ejecutar si expresin. No coincide con ninguno de los valores. Es importante entender cmo se ejecuta la sentencia switch para evitar errores. La sentencia switch ejecuta lnea por lnea, cuando se encuentra una sentencia case con un valor que coincide con el valor de la expresin switch PHP comienza a ejecutar las sentencias. PHP contina ejecutando las sentencias hasta el final del bloque switch, o la primera vez que vea una sentencia break2. Si no se escribe una sentencia break al final de una lista de sentencias case, PHP seguir ejecutando las sentencias del siguiente case. Esta caracterstica se puede utilizar para agrupar varios casos con un mismo grupo de sentencias, pero tambin puede dar lugar al llamado falltrought que trataremos de evitar pues es fuente de errores. paso 1: Se evala la "expresin" paso 2: Se ejecuta la clasula "case" que se corresponda con el valor obtenido en el paso 1. Si no se encuentra correspondencia, se ejecuta el caso "default"; y si no hay "default", termina la ejecucin de "switch". paso 3: Termina cuando se encuentra una sentencia "break" esta es obligatoria para evitar cadas al vaco. (fall through )
2 Tener en cuenta que al contrario que otros lenguajes de programacin, continue se puede aplicar en el switch
y funciona de manera similar a break. Si se tiene un switch dentro de un bucle y se desea continuar con el paso siguiente en el bucle externo, se podra usar continue 2.
- 37 -
Veamos un sencillo ejemplo en el que vamos a asignar a una variable $presupuesto el presupuesto de un departamento para una ao. Teniendo en cuenta que el departamento de matemticas tiene asignados 200, los de lengua francs 500 y el de informtica 100.
$departamento = 'INFORMATICA'; switch ($departamento) { case 'MATEMATICAS': $presupuesto = 200; // falltrought. Seguir ejecutando y // sobrescribir 200 con el valor 500. case 'LENGUA': case 'FRANCES': // agrupacin $presupuesto = 500; break; case 'INFORMATICA': $presupuesto = 100; break; default: // Deben contemplarse todos los departamentos sino error. assert(false); } // $presupuesto debe quedar inicializada. assert(isset($presupuesto)); echo $presupuesto;
- 38 -
Incrementaremos su valor con una expresin del tipo $idContador = $idContador VALOR_FIJO Ej: $nivel = $nivel + 2 $vidas = $vidas 1 $tamanyo = $tamanyo * 2 Ejemplo prctico
Introducir las notas de matemticas obtenidas por los 5 alumnos de una clase y contar cuntos de ellos han aprobado. Necesitaremos 2 contadores uno para alumnos y otro para aprobados.
Incrementaremos su valor con una expresin del tipo idAcumulador = idAcomulador VALOR_VARIABLE Ej: totalFactura = totalFactura + lineaFactura Ejemplo prctico
Hallar la suma de los 100 primeros nmeros naturales. Necesitaremos 1 contador para los nmeros y otro para la suma.
Ejemplo prctico
Sumar por un lado los nmeros impares y por otro los nmeros pares comprendidos entre 1 y 100 usando
- 39 -
CEFIRE Especfico FP
15 - BIBLIOGRAFA
DIVERSOS AUTORES Manual PHP Oficial Versin web 17/08/2010 desde RedIris http://docs.php.net/manual/es/ Editor principal Philip Olson. Copyright 1997-2010 por el Grupo de documentacin de PHP Bajo Licencia http://creativecommons.org/licenses/by/3.0/
- 40 -