Funciones en PHP

Post date: Aug 27, 2010 4:34:20 AM

Las funciones en PHP difieren bastante de las funciones en otros lenguajes de orientación a objetos, en donde la noción de método en más bien la utilizada. Para comprender las funciones de PHP hay que tener presente que su definición es una acción que se ejecuta y una vez ejecutada, la función queda globalmente disponible para ser utilizada.

Funciones globales

Una función global en PHP tiene la forma:

function MiFunccion() { instruccions para realizar la operación deseada }

Una función puede incluir parámetros y una instrucción return.

El alcance de una función es global por lo que puede ser llamada desde cualquier parte del programa.Por ejemplo la función miFuncion definida como sigue:

function MiFuncion() { echo("Mi Función"); }

Puede ser usada en las clases:

class MiClase { public function MiMetodo() { MiFuncion(); } }

Definida de esta forma, la función será llamada cada vez que el método MiMetodo se ejecute.

Otros lenguajes con orientación a objetos sólo admiten métodos por lo que no se consideran definiciones fuera del contexto de una clase.

Funciones internas

Las funciones definidas dentro de otras funciones se comportan de manera similar a las funciones globales. No tienen acceso a las variables locales de la función que las contiene, como si hubiera sido definida fuera de ella y su implementación no está basada en la noción de clausura.

Una diferencia importante con respecto a otros lenguajes es que las funciones pueden ser definidas de forma condicionada.

if($bandera) { function MiFuncion() { echo("Mi Función"); } }

Con esta definición, la función MiFuncion sólo estará definida cuando se ejecute el código y el valor de $bandera sea verdadero. Una vez que el código sea ejecutado, la función estará disponible hasta el final del programa. Como las funciones en PHP no se redefinen, es importante que la lógica del programa garantice que la definición de la función se ejecute una sola vez.

En el caso de funciones definidas dentro de funciones, ellas estarán definidas globalmente una vez que el código de definición se ejecute, como en el siguiente ejemplo:

function MiFuncion() { echo("Mi Funcion"); function MiFuncionInterna() { echo('Mi Funcion Interna'); } }

Si se trata de ejecutar MiFuncionInterna ocurrirá un error, pero una vez que MiFunción haya sido ejecutada,

ya MiFuncionInterna estará disponible, como en la siguiente secuencia de llamadas.

MiFuncion(); MiFuncionInterna();

El problema con este esquema es que MiFuncion sólo puede ejecutarse una vez, dado que una segunda ejecución provocaría un intento de redefinir MiFuncionInterna. Esto se soluciona condicionando las definiciones de funciones internas a que no estén definidas previamente:

function MiFuncion() { echo("Mi Funcion"); if(!function_exists("MiFuncionInterna")) { function MiFuncionInterna() { echo('MiFuncionInterna'); } } }

Para llamar una función interna dentro de la función que la contiene es necesario que se ejecute la definición de la función antes de utilizarla. El siguiente ejemplo no funciona porque se trata de llamar la función interna antes de ser definida.

function MiFuncion() { echo("Mi Funcion"); MiFuncionInterna(); if(!function_exists("MiFuncionInterna")) { function MiFuncionInterna() { echo('MiFuncionInterna'); } } }

La solución es ejecutar la definición antes de su uso.

function MiFuncion() { echo("Mi Funcion"); if(!function_exists("MiFuncionInterna")) { function MiFuncionInterna() { echo('MiFuncionInterna'); } } MiFuncionInterna(); }

Como en el resto de los casos, una vez definida, la función interna estará definida por el resto de la ejecución del programa.

Funciones internas a objetos

Es posible definir funciones dentro de los métodos. Las reglas son las mismas de las de la definición de funciones dentro de funciones. Están disponibles una vez se ejecute su definición hasta el resto del programa. Es importante notar que las funciones no son métodos por lo que no pueden ser llamadas con la sintaxis del tipo objeto->metodo.

Herramientas como Joomla!, el sistema de gestión de contenido que está escrito en PHP, utilizan un modelo para agregar extensiones basado en la inclusión dinámica del código de algunos métodos. Por ejemplo:

class HTMLview { public function htmlview(){ include "template.php" } }

En este caso, para extender htmlview se crea un archivo template.php en una ubicación determinada. El código incluido debe respetar la sintaxis de acciones dentro de una función, lo que también incluye funciones internas. De esta forma, una extensión compleja puede incluir definiciones de funciones, lo que permite reutilizar fragmentos de código.

Funciones anónimas

A partir de PHP 5.30 es posible definir funciones anónimas que pueden ser asignadas a variables o a campos de objetos. Ellas serán accesibles en tanto que la variable que las contiene lo sea también. Por ejemplo:

function MiFuncion(){ echo("Mi Funcion"); $MiFuncionAnonima=function() { echo('Mi Funcion Anonima'); } }

Esto define una función interna anónima que es inmediatamente asignada a una variable. Para llamarla se utiliza la sintaxis $MiFuncionAnonima(). Su alcance depende del alcance de la variable que la contiene. A diferencia de las funciones mencionadas anteriormente, las funciones anónimas si pueden manejar variables locales de su ambiente de definición y su implementación implica la construcción de una clausura para guardar las variables que serán posteriormente.

Enlaces relacionados

Cursos relacionados