Muchas veces, cuando trabajamos en el desarrolo de una aplicacion, nos
surge la necesidad de ejecutar un mismo bloque de codigo en diferentes
partes de nuestra aplicacion. Una Funcion no es mas que un
bloque de codigo al que le pasamos una serie de parametros y nos
devuelve un valor. Como todos los lenguaje de programacion, PHP trae una
gran cantidad de funciones para nuestro uso, pero las funciones mas
importantes son las que nosotros creamos.
Para declarar una funcion debemos utilizar la instruccion function
seguido del nombre que le vamos a dar, y despues entre parentesis la
lista de argumentos separados por comas, aunque tambien habrafunciones
que no recogan ningun argumento.
function nombre_de_funcion (arg_1, arg_2, ..., arg_n)
{
bloque de codigo
}
Cualquier instruccion valida de PHP puede aparecer en el cuerpo (lo
que antes hemos llamado bloque de codigo) de una funcion, incluso otras
funciones y definiciones de clases.
En PHP no podemos redefinir una funcion previamente declarada, y
ademas en PHP3, las funciones deben definirse siempre antes de que se
invoquen, en PHP4 este requerimiento ya no existe.
La instruccion RETURN
Cuando invocamos una funcion, la ejecucion del programa pasa a
ejecutar las lineas de codigo que contenga la funcion, y una vez
terminado, el programa continua su ejecucion desde el punto en que fue
llamada la funcion.
Existe una manera de terminar la ejecucion de la funcion aunque aun
haya codigo por ejecutar, mediante el uso de la instrucion return terminamos la ejecucion del codigo de una funcion y devolvemos un valor. Podemos tener varios return en
nuestra funcion, pero por lo general, cuantos máasreturn
tengamos menos reutilizable sera nuestra funcion.
<?php
function mayor ($x, $y)
{
if ($x > $y) {
return $x." es mayor que".$y;
} else {
return $y." es mayor que".$x;
}
}
?>
Aunque quedaria mejor:
<?php
function mayor ($x, $y)
{
$msg = "";
if ($x > $y) {
$msg = $x." es mayor que".$y;
} else {
$msg = $y." es mayor que".$x;
}
return $msg;
}
?>
Con la instrucion return puede
devolverse cualquier tipo de valor, incluyendo tablas y objetos. PHP solo permite a
las funciones devolver un valor, y para solventar este pequeño problema,
si queremos que nuestra funcion devuelva varios tenemos que utilizar una tabla (array).
Parametros de las funciones
Existen dos formas de pasar los parametros a una funcion, por valor
o por referencia.
Cuando pasamos una variable por valor a una funcion, ocurra lo
que ocurra en esta en nada modificara el contenido de la variable.
Mientras que si lo hacemos por referencia, cualquier cambio
acontecido en la funcion sobre la variable lo hara para siempre.
En PHP, por defecto, las variables se pasan por valor. Para hacerlo por
referencia debemos anteponer un ampersand (&)
a la variable.
<?php
function suma ($x, $y)
{
$x = $x + 1;
return $x+$y;
}
$a = 1;
$b = 2;
//parametros por valor
echo suma ($a, $b); //
imprimira 4
echo $a; //
imprimira 1
//parametros por referencia
echo suma (&$a, $b); //
imprimira 4
echo $a; //imprimira 2
?>
Si queremos que un parametro de una funcion se pase siempre por
referencia debemos anteponer un ampersand (&)
al nombre del parametro en la definicion de la funcion.
En PHP podemos definir valores por defecto para los parametros de una
funcion. Estos valores tienen que ser una expresion constante, y no una
variable o miembro de una clase. Ademas cuando usamos parametros por
defectos, estos deben estar a la derecha de cualquier parametro sin
valor por defecto, de otra forma PHP nos devolvera un error.
<?php
function suma ($x=1, $y)
{
$x = $x + 1;
return $x+$y;
}
?>
Si ejecutarmos esta funcion nos dara error, ya que hemos dado a $x
el valor 1 por defecto y la hemos
colocado a la izquierda de un parametro que no tiene valor por defecto.
La forma correcta es:
<?php
function suma ($y, $x=1)
{
$x = $x + 1;
return $x+$y;
}
?>
Cabe destacar que PHP3 no soporta un numero variable de
parametros, pero PHP4 si.
Llegados a este punto, damos un paso atras y volvemos a las variables,
para distinguir entre variables esteticas (static)
y globales (global). Las variables
estaticas se definen dentro de una funcion, la primera vez que es
llamada dicha funcion la variable se inicializa, guardando su valor para
posteriores llamadas.
<?php
function contador ()
{
static $count = 0;
$count = $count + 1;
return $count;
}
echo contador()."<BR>"; //
imprimirá 1
echo contador()."<BR>"; //
imprimira 2
echo contador()."<BR>"; //
imprimira 3
?>
Las variables globales, no se pueden declarar dentro de una funcion,
lo que hacemos es llamar a una variable que ya ha sido declarada, tomando
el valor que tenga en ese momento, pudiendo se modificado en la
funcion.
<?php
var $a = 1;
function ver_a()
{
global $a;
echo $a."<BR>"; //
imprimira el valor de $a
$a += 1; //
sumamos 1 a $a
}
echo ver_a(); // imprimira 1
echo ver_a(); // imprimira 2
$a = 7;
echo ver_a(); // imprimira 7
echo ver_a(); // imprimira 8
?>
Funciones Variable
PHP soporta el concepto de funciones variables, esto es
significa que si una variable tiene unos parentesis añadidos al final,
PHP buscara un funcion con el mismo nombre que el contenido de la
variable, e intentara ejecutarla.
<?php
function imprime($texto) {
echo $texto . "\n";
}
function imprimeNegrilla($texto){
echo
"<B>$texto</B>\n";
}
$MiFunc = "imprime";
$MiFunc("Hola"); //imprimira
Hola
$MiFunc = "imprimeNegrilla";
$MiFunc("Hola"); //imprimira
Hola
?>
Recursion
PHP tambien permite la recursion, es decir, una funcion se puede
llamar asi misma. Para aclarar el concepto de recursion, vamos a crear
una funcion que comprueba si un numero es entero o no.
Un numero que no sea entero (7'4), tiene una parte entera y otra
decimal (comprendida entre 0 y 1), lo que vamos a hacer para
comprobar si un numero es entero o no, sera restarle 1 al numero en
cuestion hasta que nos que demos sin parte entera, y entoces
comprobaremos si tiene parte decimal (un poco lioso todo esto).
<?php
function esEntero($numero) {
if ($numero > 1) {
return (esEntero($numero -1));
} elseif ($numero < 0) {
/* como
los num. son simetricos
chequemos
lo convertimos a positvo */
return (esEntero((-1) * $numero
-1));
} elseif (($numero > 0) AND
($numero < 1)) {
return ("NO");
} else {
/* el cero
es entero por definicion */
return ("SI");
}
} //fin function
echo "Es 0 un numero entero?
".esEntero(0)."\n";
echo "Es 3.5 un numero entero?
".esEntero(3.5)."\n";
echo "Es -7 un numero entero?
".esEntero(-7)."\n";
echo "Es -9.2 un numero entero?
".esEntero(9.2)."\n";
?>
|