You are on page 1of 12

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Funciones
Introduccin
Las funciones son grupos de instrucciones independientes que tienen un propsito determinado. As, tenemos funciones que calculan la raz cuadrada de un nmero, nos dan un nmero aleatorio o permiten contar los caracteres de una palabra. La sintaxis bsica de una funcin es la siguiente: nombre_funcin parmetro3...parmetro_n) (parmetrol, parmetro2,

Las funciones pueden ser llamadas con varios parmetros o con ninguno, dependiendo de su definicin. Cuando PHP encuentra en el cdigo la llamada a una funcin, primero, evala cada argumento y los utiliza como parmetro de entrada. Despus, ejecuta la funcin y devuelve el valor solicitado o realiza alguna accin sin enviar ningn valor de salida. El siguiente ejemplo contiene un conjunto de llamadas a funciones con 0, 1 2 parmetros de entrada: Ejemplo Funciones_Predefinidas.php: <?php echo sqrt(9) ."<br>"; // Raz cuadrada de 9 es 3 echo rand(10,20) ."<br>"; // Nmero aleatorio entre 10 y 20 echo pi(); // Nmero pi ?> El resultado por pantalla es: 3 13 3.1415926535898

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Valores de las funciones


Cada funcin en PHP se considera como una expresin. Se pueden utilizar las funciones para lo mismo que se utilizan las expresiones, como almacenar su resultado en una variable o formar parte de una expresin ms compleja. Ejemplo Funciones_Valores.php: <?php $numero_aleatorio = rand (1,100); // Se almacena en una variable echo $numero_aleatorio ."<br>"; $numero_aleatorio = rand (1,100) + rand (1,100) * sqrt(9); // Expresin compleja echo $numero_aleatorio ."<br>"; ?> El resultado por pantalla es: 47 269 No todas las funciones devuelven un valor numrico. Tambin pueden devolver caracteres, array o true/false si la funcin ha tenido xito o no. Este tipo de funciones se utilizan para conectar a bases de datos, escribir en ficheros de texto, manipular imgenes, etctera.

Funcin de ejemplo. Obtencin de la fecha actual


Existen un conjunto de funciones que permiten averiguar la fecha actual del sistema. Una de estas funciones es date(), que permite recuperar el ao, da, mes, etctera, del momento en el que se hace la consulta. Para averiguar el da de hoy podemos utilizar la construccin: Ejemplo Funciones_Date.php: <? echo date("d")."<br>"; ?> El resultado por pantalla es: 18 El parmetro que pasamos entre parntesis indica a la funcin el formato de fecha que queremos obtener. En este caso, la d indica que queremos obtener el da en formato numrico.

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

La siguiente tabla relaciona los caracteres dentro de la funcin date() con su aplicacin prctica: Carcter a A h H g G i s d j w m n Y y z t Valor Imprime am o pm Imprime AM o PM La hora en formato (01 12) La hora en formato 24 (00 23) La hora de 1 a 12 sin un cero delante La hora de 1 a 23 sin un cero delante Los minutos de 00 a 59 Los segundos de 00 a 59 Da del mes (01 a 31) Da del mes sin cero (1 a 31) Da de la semana (0 a 6). El 0 es el domingo Mes actual (01 a 12) Mes actual sin ceros (1 a 12) Ao con 4 dgitos (2008) Ao con 2 dgitos (08) Da del ao (0 a 365) Nmero de das que tiene el mes actual

Se pueden utilizar varios caracteres dentro de la funcin, indicando el formato de fecha que nos interesa. Ejemplo Funciones_Date.php: <?php $meses = array ("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"); echo "Fecha actual: " . date("d-m-Y") . "<br>"; echo "Da del ao: " . date("z") . "<br>"; echo "Estamos en el mes: " . $meses[date("n")-1]; ?> El resultado por pantalla es: Fecha actual: 16-01-2008 Da del ao: 15 Estamos en el mes: Enero

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Funciones de usuario
Para realizar programas complejos en PHP, no es necesario escribir funciones. Se pueden escribir programas utilizando todo lo aprendido hasta ahora. A medida que el proyecto se haga ms complejo, el cdigo se har ms extenso y menos legible. En este punto se deber empezar a pensar en crear funciones que realicen determinadas tareas.

Definicin de funciones
El formato es el siguiente: function nombre_funcin($argumentol, $argumento2, ..){ instruccin1; instruccin2; } Se comienza con la palabra reservada function seguida del nombre de la funcin y el nmero de parmetros necesarios. El bloque de cdigo que pertenece a nuestra funcin debe introducirse entre dos smbolos de llave { }. Un ejemplo clsico consiste en calcular el factorial de varios nmeros. El factorial del nmero x se obtiene multiplicando el nmero x por el factorial de (x-1), teniendo en cuenta que el factorial de 1 es 1. Por ejemplo, el factorial de 3 sera 3 por el factorial de 2, es decir 3 * 2 * 1. Ejemplo Funcion_Factorial.php: <?php $resultado = 1; $factorial = 3; // Queremos calcular el factorial de 3 for ($x = $factorial; $x > 0; $x--) { $resultado = $resultado * $x; } echo "El factorial de $factorial es $resultado<br>"; $resultado = 1; $factorial = 4; // Queremos calcular el factorial de 4 for ($x = $factorial; $x > 0; $x--) { $resultado = $resultado * $x; } echo "El factorial de $factorial es $resultado<br>"; $resultado = 1; $factorial = 5; // Queremos calcular el factorial de 5 for ($x = $factorial; $x > 0; $x--) { $resultado = $resultado * $x; } echo "El factorial de $factorial es $resultado<br>"; ?>

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

El resultado por pantalla es: El factorial de 3 es 6 El factorial de 4 es 24 El factorial de 5 es 120 En el cdigo anterior, se puede ver que sigue un patrn muy evidente. El clculo del factorial se realiza en un bucle que va disminuyendo el valor de una variable y multiplicando todos los valores entre s. Aprovechando este patrn se puede crear una funcin que realice el factorial del nmero X ahorrando lneas de cdigo: Ejemplo Funcion_Factorial.php: <?php function factorial($numero){ $resultado = 1; for ($x = $numero; $x > 0; $x--) { $resultado = $resultado * $x; } return $resultado; } echo "El factorial de 3 es ".factorial(3)."<br>"; echo "El factorial de 4 es ".factorial(4)."<br>"; echo "El factorial de 5 es ".factorial(5)."<br>"; ?> El resultado por pantalla es igual que el anterior: El factorial de 3 es 6 El factorial de 4 es 24 El factorial de 5 es 120 Si comparamos los dos ejemplos, podemos llegar a la conclusin de que el segundo es mucho ms legible y ms sencillo de realizar. La funcin factorial() hace uso de la palabra reservada return, que es la encargada de devolver el valor que estamos solicitando cuando se invoca la funcin.

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Parmetros insuficientes
Si se llama a una funcin con menos parmetros de los que debe utilizar por definicin aparecer el siguiente error por defecto: Warning: Missing argument 1 for factorial() Este tipo de error no es crtico y puede controlarse con excepciones. Adems de las excepciones podemos utilizar el operador de supresin de error @ delante de la funcin de esta forma: @factorial( ). No se recomienda eliminar los mensajes de error en este caso, ya que hace complicado la correccin de los posibles fallos.

Parmetros en exceso
Si al contrario que en el apartado anterior se le pasa a una funcin ms parmetros que los definidos, stos sern omitidos y la ejecucin continuar normalmente sin ningn mensaje de error.

mbito de las variables


Las variables definidas en un archivo de PHP permanecen declaradas en todo el fichero, menos en las funciones. Las funciones crean un entorno de ejecucin donde slo pueden ver las variables que estn dentro de las mismas. Aunque no parece muy lgico, esto nos permite tener variables con el mismo nombre en diferentes funciones, haciendo el cdigo reutilizable. Ejemplo Ambito_Variables.php: <?php $pi = 3.14; function valorPi(){ if (!isset($pi)){ $pi = pi(); } return $pi; } echo valorPi(); ?>

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Se puede observar que definimos, al comienzo del cdigo, la variable $pi como un valor aproximado del nmero pi (3,14). La funcin valorPi() comprueba si la variable $pi est definida, y si no lo est recupera ese valor con una funcin de PHP. Para entender el alcance de las variables vamos a ir paso a paso viendo qu es lo que ocurre: Se define $pi a nivel global en el programa. Se define la funcin valorPi() que por ahora no se utiliza. Se lanza la ejecucin de la funcin. La funcin evala si existe la variable $pi y da como resultado false. Esto es as porque la variable est definida fuera de la funcin y no dentro de ella, por lo tanto se considera que la variable $pi dentro de la funcin es distinta (entorno local) a la variable $pi definida fuera de la funcin (entorno global). El resultado por pantalla es 3.1415926535898.

El resultado por pantalla es: 3.1415926535898 Esta forma de programar se considera la correcta en la comunidad de desarrolladores de PHP. An as, existen mecanismos que permiten que una variable definida fuera de una funcin pueda ser utilizada dentro de la misma, simplemente anteponiendo la palabra reservada global a la variable definida dentro de la funcin. Ejemplo Ambito_Variables.php: <?php $pi = 3.14; function valorPiGlobal(){ global $pi; if (!isset($pi)){ $pi = pi(); } return $pi; } echo valorPiGlobal(); ?> Si vemos paso a paso el ejemplo: Se define $pi a nivel global en el programa. Se define la funcin valorPiGlobal() que por ahora no se utiliza. Se lanza la ejecucin de la funcin. Dentro de la funcin, la variable $pi se define como global, es decir, se utiliza la variable creada al principio del cdigo. La funcin evala si existe la variable $pi y da como resultado true. El resultado por pantalla es 3.14.

El resultado por pantalla es: 3.14

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Variables estticas
Por defecto, las funciones que creamos en PHP no retienen en memoria el valor de las variables que se utilizan. Cada llamada a una funcin implica la nueva creacin de las variables locales con su valor inicial. La declaracin static aadida a una variable causa que la funcin retenga en memoria el valor de esa variable en cada llamada. Como se puede ver en el ejemplo, las 100 llamadas a la funcin contador() dan siempre el mismo resultado, porque la variable $contador se crea con cada llamada. Ejemplo Ambito_Variables_Static.php: <?php function contador(){ $contador = 0; $contador = $contador +1; return $contador; } for ($x = 1; $x <= 100; $x++){ echo contador() ." , "; } ?> El resultado por pantalla es: 1 1 1 1 1 1 1 , , , , , , , 1 1 1 1 1 1 1 , , , , , , , 1 1 1 1 1 1 1 , , , , , , , 1 1 1 1 1 1 1 , , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , , 1 1 1 1 1 1 , , , , , ,

Sin embargo, podemos hacer que la funcin recuerde los valores, aadiendo la palabra static a la definicin de la variable: Ejemplo Ambito_Variables_Static.php: <?php function contadorStatic(){ static $contador = 0; $contador = $contador +1; return $contador; } for ($x = 1; $x <= 100; $x++){ echo contadorStatic() ." , "; } ?>

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

El resultado por pantalla es: 1 , 2 , 15 , 16 28 , 29 41 , 42 54 , 55 67 , 68 80 , 81 93 , 94 3 , , 17 , 30 , 43 , 56 , 69 , 82 , 95 4 , , , , , , , , 5 , 6 , 7 18 , 19 , 20 31 , 32 , 33 44 , 45 , 46 57 , 58 , 59 70 , 71 , 72 83 , 84 , 85 96 , 97 , 98 , , , , , , , , 8 , 9 , 10 , 11 , 12 , 13 21 , 22 , 23 , 24 , 25 , 26 34 , 35 , 36 , 37 , 38 , 39 47 , 48 , 49 , 50 , 51 , 52 60 , 61 , 62 , 63 , 64 , 65 73 , 74 , 75 , 76 , 77 , 78 86 , 87 , 88 , 89 , 90 , 91 99 , 100 , , , , , , , , 14 27 40 53 66 79 92 , , , , , , ,

include() y require()
A medida que un proyecto se hace ms complejo, crearemos funciones muy tiles para conectar a bases de datos, conectar por FTP, etctera y, seguramente, se quiera emplear estas funciones en otros proyectos distintos para ahorrar tiempo. El camino para hacer esto es muy sencillo. Slo tiene que guardar las funciones necesarias en un fichero con extensin .php, .html, .css, etctera y utilizar las directivas include() o require() desde la web que vaya a utilizarlas. En PHP no existen apenas diferencia entre ambas funciones, salvo que la funcin include() es ms tolerante a fallos que require() y permite continuar la ejecucin del programa aunque se haya encontrado un fallo. La conclusin es que debe utilizarse require() para aplicaciones que necesiten obligatoriamente algn archivo crtico y no pueda continuarse la ejecucin sin l. Si en el desarrollo de nuestro proyecto nos encontramos con que vamos a utilizar varios archivos que hacen llamadas unos a otros podra pasar que hagamos varias inclusiones del mismo archivo en distintos puntos, provocando algn fallo difcil de detectar. Las funciones require_once() e include_once() solucionan ste problema, ya que si se intenta incluir un fichero varias veces con dichas funciones, PHP simplemente ignorar las llamadas. Ejemplo Ambito_Variables_Static.php: include ("Ambito_Variables.php"); require ("Operador_Suprime_Error.php"); require_once ("Funciones_Date.php"); include_once ("Funciones_Date.php");

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Llamadas por valor


Por defecto, las llamadas a funciones se hacen por valor. Esto quiere decir que las variables que se utilizan como parmetros se copian al entorno de la funcin. Todos los cambios de valor que sufra la variable en este entorno no afectarn al programa fuera de la funcin. Ejemplo Llamadas_Valor.php: <?php function elevado($numero, $indice){ $resultado = $numero; for ($x=$indice; $x>0; $x--){ $resultado = $resultado * $numero; } $numero = $resultado; return $numero; } $numero = 2; $indice = 5; echo $numero." elevado a ".$indice." es igual a ".elevado($numero, $indice) ."<br>"; echo $numero." elevado a ".$indice." es igual a ".elevado ($numero, $indice) ."<br>"; ?> El resultado por pantalla es: 2 elevado a 5 es igual a 64 2 elevado a 5 es igual a 64 El ejemplo anterior calcula el resultado de $numero elevado a $indice. La funcin elevado() crea un bucle para multiplicar $numero por las veces que indica el $indice y lo va almacenando en la variable temporal $resultado. Cuando el bucle termina, este resultado se vuelve a pasar a la variable $numero, que es devuelta como salida de la funcin. Cuando volvemos a ejecutar la funcin con los mismos parmetros, vemos que la variable $numero no ha cambiado en la ejecucin anterior, porque, en realidad, lo que se pasa es una copia del valor y todas las modificaciones se hacen sobre la copia y no sobre la variable original.

10

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Llamadas por referencia


PHP ofrece actualmente dos caminos diferentes para cambiar sus argumentos: en la definicin de la funcin y en la llamada a la misma. Las variables pasadas por referencia pueden ser modificadas durante el proceso de una llamada, porque lo que se pasa no es una copia, sino la variable en s misma. Para pasar variables por referencia hay que utilizar el operador (&) delante de la variable. Ejemplo Llamadas_Referencia.php: <?php function elevado(&$numero,&$indice){ $resultado = $numero; for ($x=$indice; $x>0; $x--) { $resultado = $resultado * $numero; } $numero = $resultado; return $numero; } $numero = 2; $indice = 5; echo $numero." elevado a ".$indice." es igual a .elevado($numero, $indice) ."<br>"; echo $numero." elevado a ".$indice." es igual ".elevado($numero, $indice) ."<br>"; echo $numero." elevado a ".$indice." es igual ".elevado($numero, $indice) ."<br>"; ?> El resultado por pantalla es: 2 elevado a 5 es igual a 64 64 elevado a 5 es igual a 68719476736 68719476736 elevado a 5 es igual a 1.0531229166856E+065 El funcionamiento es exactamente igual, pero el resultado es distinto. El operador (&) hace que la variable $numero pueda ser modificada dentro de la funcin y guarde este nmero fuera de ella.

" a a

11

ASIX Mdulo 9

UF 1: Lenguaje de guin de servidor

Referencia a variables
Las referencias pueden usarse tambin fuera de las funciones, en el mbito de las variables. El ejemplo siguiente muestra cmo trabaja el operador (&) con las variables: Ejemplo Referencia_Variables.php: <?php $nombre = "Antonio"; $apellidos = "Muoz Gonzlez"; //$nombre_auxiliar es simplemente una copia de $nombre $nombre_auxiliar = $nombre; //$nombre_referencia es una referencia a la variable $nombre_referencia = &$nombre; echo $nombre." " . $apellidos."<br>"; $nombre_auxiliar = "Jose"; echo $nombre. " " . $apellidos."<br>"; $nombre_referencia = "Francisco"; echo $nombre." " . $apellidos."<br>"; ?> El resultado por pantalla es: Antonio Muoz Gonzlez Antonio Muoz Gonzlez Francisco Muoz Gonzlez $nombre_auxiliar es una copia de la variable $nombre y por mucho que la cambiemos, $nombre permanecer con el mismo valor. En cambio, la variable $nombre_referencia es un alias de $nombre, por lo tanto todos los cambios que se hagan en cualquiera de las dos variables les afectar por igual.

12

You might also like