|
Las funciones
Muchas veces, cuando trabajamos en el desarrolo de una aplicación, nos
surge la necesidad de ejectar un mismo bloque de código en diferentes
partes de nuestra aplicación. Una Función no es más que un
bloque de código al que le pasamos una serie de parámetros y nos
devuelve un valor. Como todos los lenguaje de programación, PHP trae una
gran cantidad de funciones para nuestro uso, pero las funciones más
importantes son las que nosotros creamos.
Para declara una funcion debemos utilizar la instrucción function
seguido del nombre que le vamos a dar, y después entre parentesis la
lista de argumentos separados por comas, aunque también habrá funciones
que no recogan ningún argumento.
function nombre_de_funcion (arg_1, arg_2, ...,
arg_n)
{
bloque de código
}
Cualquier instrucción válida de PHP puede aparecer en el cuerpo (lo
que antes hemos llamado bloque de código) de una función, incluso otras
funciones y definiciones de clases.
En PHP no podemos redefinir una función previamente declarada, y
además en PHP3, las funciones deben definirse siempre antes de que se
invoquen, en PHP4 este requerimiento ya no existe.
La instrucción RETURN
Cuando invocamos una función, la ejecución del programa pasa a
ejecutar las líneas de código que contenga la función, y una vez
terminado, el programa continua su ejecución desde el punto en que fué
llamada la función.
Existe una manera de terminar la ejecución de la función aunque aún
haya código por ejecutar, mediante el uso de la instrución return
terminamos la ejecución del código de una función y devolvemos un
valor. Podemos tener varios return en
nuestra función, pero por lo general, cuantos más return
tengamos menos reutilizable será nuestra función.
<?php
function mayor ($x, $y)
{
if ($x > $y) {
return $x." es mayor que
".$y;
} else {
return $y." es mayor que
".$x;
}
}
?>
Aunque quedariá 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 instrución 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 función devuelva varios tenemos que utilizar
una tabla (array).
Parámetros de las funciones
Existen dos formas de pasar los parámetros a una función, por valor
o por referencia.
Cuando pasamos una variable por valor a una funcion, ocurra lo
que ocurra en ésta en nada modificará el contenido de la variable.
Mientras que si lo hacemos por referencia, cualquier cambio
acontecido en la función sobre la variable lo hará 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;
//parámetros por valor
echo suma ($a, $b); //
imprimirá 4
echo $a; //
imprimirá 1
//parámetros por referencia
echo suma (&$a, $b); //
imprimirá 4
echo $a; //imprimirá
2
?>
Si queremos que un parámetro de una función se pase siempre por
referencia debemos anteponer un ampersand (&)
al nombre del parámetro en la definición de la función.
En PHP podemos definir valores por defecto para los parámetro de una
función. Estos valores tienen que ser una expresión constante, y no una
variable o miembro de una clase. Además cuando usamos parámetros por
defectos, éstos deben estar a la derecha de cualquier parámetro sin
valor por defecto, de otra forma PHP nos devolverá un error.
<?php
function suma ($x=1, $y)
{
$x = $x + 1;
return $x+$y;
}
?>
Si ejecutarmos esta función nos daría error, ya que hemos dado a $x
el valor 1 por defecto y la hemos
colocado a la izquierda de un parámetro 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 número variables de
parámetros, pero PHP4 sí.
Llegados a este punto, damos un paso atrás y volvemos a las variables,
para distinguir entre variables estáticas (static)
y globales (global). Las variables
estáticas se definen dentro de una función, la primera vez que es
llamada dicha función 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>"; //
imprimirá 2
echo contador()."<BR>"; //
imprimirá 3
?>
Las variables globales, no se pueden declarar dentro de una función,
lo que hacemos el llamar a una variable que ya ha sido declarada, tomando
el valor que tenga en ese momento, pudiendo se modificado en la
función.
<?php
var $a = 1;
function ver_a()
{
global $a;
echo $a."<BR>"; //
imprimirá el valor de $a
$a += 1; //
sumamos 1 a $a
}
echo ver_a(); // imprimirá 1
echo ver_a(); // imprimirá 2
$a = 7;
echo ver_a(); // imprimirá 7
echo ver_a(); // imprimirá 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 buscará un función con el mismo nombre que el contenido de la
variable, e intentará ejecutarla.
<?php
function imprime($texto) {
echo $texto . "\n";
}
function imprimeNegrilla($texto){
echo
"<B>$texto</B>\n";
}
$MiFunc = "imprime";
$MiFunc("Hola"); //imprimirá
Hola
$MiFunc = "imprimeNegrilla";
$MiFunc("Hola"); //imprimirá
Hola
?>
Recursión
PHP también permite la recursión, es decir, una función se puede
llamar así misma. Para aclarar el concepto de recursión, vamos a crear
una función que comprueba si un número es entero o no.
Un número 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 número es entero o no, será restarle 1 al número en
cuestión hasta que nos que demos sin parte entera, y entoces
comprobaremos si tiene parte decimal (un poco lioso todo ésto).
<?php
function esEntero($numero) {
if ($numero > 1) {
return (esEntero($numero -1));
} elseif ($numero < 0) {
/* como
los núm. son simétricos
chequeamos
lo convertimos a positvo */
return (esEntero((-1) * $numero
-1));
} elseif (($numero > 0) AND
($numero < 1)) {
return ("NO");
} else {
/* el cero
es entero por definición */
return ("SI");
}
} //fin function
echo "¿Es 0 un número entero?
".esEntero(0)."<BR>\n";
echo "¿Es 3.5 un número entero?
".esEntero(3.5)."<BR>\n";
echo "¿Es -7 un número entero?
".esEntero(-7)."<BR>\n";
echo "¿Es -9.2 un número entero?
".esEntero(9.2)."<BR>\n";
?>
|