Professional Documents
Culture Documents
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
ASIX Mdulo 9
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
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
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
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.
ASIX Mdulo 9
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.
ASIX Mdulo 9
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
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
10
ASIX Mdulo 9
" a a
11
ASIX Mdulo 9
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