Las funciones en PHP

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»;

?>