Funciones y Bibliotecas

Funciones

Para comenzar, diremos que una función es un conjunto de instrucciones que se ejecutan cada vez que son llamadas en el cuerpo central de nuestro programa. La utilidad de las funciones es enorme, si nos ponemos a pensar que una llamada a una función nos ahorraría decenas (o cientos) de líneas de código, pues bastaría una sola llamada a la función cada vez que sea necesario, en vez de escribir una y otra vez el mismo código con distintos parámetros.

Las funciones deben definirse antes de utilizarlas (aunque no sea en el mismo fragmento de código php). Las funciones pueden no tener argumento o tener argumentos por valor o por referencia.

Los nombres de las funciones siguen las mismas reglas de los identificadores de PHP, es decir, deben comenzar por una letra o un guion bajo (_) y el resto de caracteres pueden ser letras, números o guiones bajos (se pueden utilizar caracteres no ingleses como acentos, eñes, etc), pero los nombres de funciones no distinguen entre mayúsculas o minúsculas.

La guía de estilo PEAR para PHPrecomienda que los nombres de las funciones sigan el estilo camelCase (es decir, sin espacios ni guiones, con la primera palabra en minúsculas y el resto con la primera letra en mayúsculas).

Una función está compuesta por la palabra reservada para PHP function, un nombre y una lista de parámetros, en caso que reciba parámetros. Para declarar una función, debe hacerse de la siguiente forma:

function nombre_de_funcion (lista_de_parametros)

Un breve ejemplo es el siguiente:



        
<?php
function hola(){
echo "<B>Esta es una prueba</B>";
}
echo "Este es el cuerpo de nuestro programa";
echo "<BR>";
echo "Aquí está la llamada a la función:<BR>";
hola();
?>

En el ejemplo, la función hola(), no retorna ningún valor, y no recibe parámetro alguno (por eso los paréntesis vacíos). Todo lo que hace es enviar un mensaje a la pantalla que dice "Esta es una prueba" con un atributo de negrita. Una vez más, la utilidad real de esta función estriba en el hecho de que si en algún momento nuestro programa crece de manera exponencial y se nos hace necesario imprimir, digamos treinta veces la cadena "Esta es una prueba" sería necesario escribir treinta veces la instrucción echo "Esta es una prueba"; lo cual se hace un poco más difícil que simplemente escribir la llamada a la funciónhola(). Por otro lado, en caso de que necesitasemos cambiar el mensaje desplegado, tal vez por algo un tanto más profesional como "Esta ya no es una prueba", es mucho, mejor aún, muchísimo mejor cambiar este mensaje una vez, en la llamada a la función, que treinta veces, en cada instrucción echo.

Parametros

Los parámetros en las funciones son los valores que la función recibe para poder operar y llevar a cabo todas las instrucciones que dicha función tiene en su cuerpo.

Valor de retorno

El valor de retorno es el valor que la función retorna al cuerpo del programa o al cuerpo de la función que la llamó (si, como ya habrán adivinado, las funciones también pueden anidarse y una función puede llamar a otra función) para poder operar con ese valor retornado.

Para saber cómo funcionan los dos conceptos anteriores, veamos otro ejemplo:>

 <?php
function iva($precio_original){
$precio_final = ($precio_original * 0.13) + $precio_original;
return $precio_final;
}

echo "<CENTER>Cálculo del Impuesto sobre el Valor Agregado (IVA)</CENTER>";
$producto = "Disco de Joaquín Sabina";
$precio_original = 15.50;
echo "El producto es: ".$producto."<BR>";
echo "El precio original es: ".$precio_original."<BR>";
echo "El precio final es: ";
echo iva($precio_original);
?>
                       
        

El resultado en pantalla es el siguiente:

Bien, como podrán ver, el trabajo con funciones facilita la existencia del programador (y vaya que sí lo hace) de una forma enorme. En el caso de que necesitaremos cambiar el porcentaje del impuesto (ojalá que a un porcentaje menor), bastaría con cambiar el valor única y exclusivamente en el cuerpo de la función, y no en cada operación que efectuamos a lo largo del programa.

Parámetros por valor, por referencia y por defecto

La información que se le pasa a las funciones puede pasársele por medio de una serie de constantes y/o variables separadas por comas, como ya vimos en la entrega anterior. Los parámetros que se pasan a las funciones pueden ser por valor, por referencia y parámetros por defecto

Parámetros por valor

Por defecto, los parámetros se pasan por valor. Esto significa que si el valor de la variable que se pasa como parámetro a la función sufre algún cambio en su valor dentro de la función, éste cambio no afectará al valor original de la variable.

El ejemplo siguiente aclara las dudas de mejor manera:

<?php
$original = "Esto es fuera de la función";

function cambio($original){
$original = "Esto es dentro de la función";
echo $original;
}

echo "Fuera de la función la variable es: ";
echo $original."<BR>";
echo "Dentro de la función, la variable es: ";
cambio($original);
echo "<BR>Esto está fuera de la función de nuevo: ";
echo $original;
?>
        

Lo anterior produce el siguiente resultado:

Parámetros por referencia

Cuando se pasan parámetros por referencia, le damos autorización a la función de cambiar permanentemente el valor original de la variable.

Para pasar siempre un parámetro por referencia, basta con anteponer un ampersand (&) al nombre del parámetro en la definición de la función de la siguiente forma:

 <?php
$original = "Esto es fuera de la función";

function cambio_total(&$original){
$original = "Esto es dentro de la función y fuera de la función";
echo $original;
}

echo "Fuera de la función la variable es: ";
echo $original."<BR>";
echo "Dentro de la función, la variable es: ";
cambio_total($original);
echo "<BR>Esto está fuera de la función de nuevo: ";
echo $original;
?>       
        

El código anterior produce la siguiente salida:

Como se darán cuenta, la variable $original cambia definitivamente de valor al entrar al cuerpo de la función, gracias a que su parámetro (es decir la variable $original) se ha pasado por referencia.

Parámetros por defecto

Los valores por defecto son expresiones constantes y no variables, que se pasan a la función. Una observación importante que debemos hacer, es que los parámetros por defecto deben ser declarados a la derecha de cualquier parámetro que no sea por defecto pasado a la función.

El ejemplo siguiente demuestra lo que significa pasar un parámetro por defecto:

<?php

function por_defecto($autor, $libro = "Cien años de soledad"){

return "El libro es $libro y su autor es $autor";
}
echo por_defecto("Gabriel García Márquez");
?>
        

el resultado sera:

Ejemplo de función y de su uso:

<?php
// ESTA ES LA DEFINICIÓN DE LA FUNCIÓN calculaHipotenusa
function calculaHipotenusa($arg1, $arg2)
{
    $hipotenusa = sqrt($arg1 * $arg1 + $arg2 * $arg2);
    return $hipotenusa;
}

// ESTO ES UN EJEMPLO DE USO DE LA FUNCIÓN calculaHipotenusa
$cateto1 = 12;
$cateto2 = 16;
$hipotenusa = calculaHipotenusa($cateto1, $cateto2);

print "<p>El triángulo de lados $cateto1, $cateto2 \n";
print "y $hipotenusa es rectángulo.</p>\n";
?>
<p>El triángulo de lados 12, 16 y 20 es rectángulo.</p>

PHP no distingue entre mayúsculas y minúsculas en los nombres de las funciones.

<?php

// ESTA ES LA DEFINICIÓN DE LA FUNCIÓN calculaHipotenusa
function calculaHipotenusa($arg1, $arg2)
{
    $hipotenusa = sqrt($arg1*$arg1+$arg2*$arg2);
    return $hipotenusa;
}

// ESTO ES UN EJEMPLO DE USO DE LA FUNCIÓN calculaHipotenusa
$cateto1 = 12;
$cateto2 = 16;
$hipotenusa = CALCULAHIPOTENUSA($cateto1, $cateto2);

print "<p>El triángulo de lados $cateto1, $cateto2 \n";
print "y $hipotenusa es rectángulo.</p>\n";
?>
<p>El triángulo de lados 12, 16 y 20 es rectángulo.</p>

No se pueden definir dos funciones con el mismo nombre.

Incorrecto
<?php
function prueba()
{
    return;
}

function Prueba()
{
    return;
}
?>

Fatal error: Cannot redeclare Prueba() (previously declared in ejemplo.php:4) in ejemplo.php on line 10

Funciones con argumentos predeterminados

En PHP se pueden definir funciones con argumentos predeterminados, de manera que si en la llamada a la función no se envía un argumento, la función asume un valor predeterminado. Lógicamente, los argumentos predeterminados deben ser los últimos en la lista de argumentos, para evitar ambigüedades.

Los argumentos predeterminados se establecen en la definición de la función, igualando el nombre del argumento a su valor predeterminado.

El ejemplo siguiente muestra una función que calcula diferentes tipos de media (aritmética, geométrica, armónica). Los argumentos de la función son los números cuya media se debe calcular y el tipo de media a calcular. En el ejemplo, el tipo de media predeterminado es la media aritmética.

<?php
// ESTA ES LA DEFINICIÓN DE LA FUNCIÓN calculaMedia
function calculaMedia($arg1, $arg2, $arg3 = "aritmética")
{
    if ($arg3 == "aritmética") {
        $media = ($arg1 + $arg2) / 2;
    } elseif ($arg3 == "geométrica") {
        $media = sqrt($arg1 * $arg2) / 2;
    } elseif ($arg3 == "armónica") {
        $media = 2 * ($arg1 * $arg2) / ($arg1 + $arg2);
    }
    return $media;
}

// ESTO SON EJEMPLOS DE USO DE LA FUNCIÓN calculaMedia
$dato1 = 12;
$dato2 = 16;

// EL TERCER ARGUMENTO INDICA EL TIPO DE MEDIA A CALCULAR
$media = calculaMedia($dato1, $dato2, "geométrica");
print "<p>La media geométrica de $dato1 y $dato2 es $media.</p>\n";

// AL NO PONER EL TERCER ARGUMENTO, DEVUELVE LA MEDIA ARITMÉTICA
$media = calculaMedia($dato1, $dato2);
print "<p>La media aritmética de $dato1 y $dato2 es $media.</p>\n";
?>
<p>La media geométrica de 12 y 16 es 6.9282032302755.</p>
<p>La media aritmética de 12 y 16 es 14.</p>

Bibliotecas

Las bibliotecas son archivos php que se pueden incluir en cualquier otro archivo php. Las bibliotecas se suelen utilizar para centralizar fragmentos de código que se utilizan en varias páginas. De esa manera, si se quiere hacer alguna modificación, no es necesario hacer el cambio en todos las páginas sino únicamente en la biblioteca.

Por ejemplo, si definimos en la biblioteca una función que imprima la cabecera de las páginas, desde cualquier página se puede incluir la biblioteca mediante la construcción include y llamar a la función como si se hubiera definido en la propia página:


Se pueden crear todas las bibliotecas que se necesiten e incluir cualquier número de bibliotecas en cualquier punto de un programa. Las bibliotecas pueden a su vez incluir otras bibliotecas.


Normalmente, las bibliotecas suelen contener funciones, definiciones de constantes o inicialización de variables, pero en realidad pueden incluir cualquier tipo de código php, que se ejecutará en la posición en la que se incluya la biblioteca.

Sobre este punto en concreto, la guía de estilo PSR-1 comenta que en cualquier fichero de una biblioteca se pueden definir funciones, constantes, clases, etc. o se puede incluir parte de la lógica del programa (generar salida, modificar variables, etc.), pero prescribe que no se hagan las dos cosas en un mismo fichero.

En el ejemplo siguiente, las bibliotecas modifican variables, lo que afecta a su valor.


Existe una construcción similar a include, la construcción require. La diferencia con respecto a include es que require produce un error si no se encuentra el archivo (y no se procesa el resto de la página), mientras que include sólo produce un aviso (y se procesa el resto de la página).

En un mismo archivo php se pueden incluir varias construcciones include o require, pero si las bibliotecas incluidas contienen definiciones de funciones, al incluir de nuevo la definición de la función se genera un error.

Para que no ocurra este problema se pueden utilizar las funciones include_once o require_once, que también incluyen los ficheros pero que, en caso de que los ficheros ya se hayan incluido, entonces no los incluyen.


Las bibliotecas están habitualmente en el mismo servidor que los programas, pero podrían estar en otros servidores y acceder a ellas por HTTP, no como ficheros locales. La directiva de configuración allow_url_include permite acceder a bibliotecas por HTTP (suele estar desactivada).


Las cuatro construcciones (include, require, include_once y require_once) pueden utilizarse escribiendo entre paréntesis el nombre de los ficheros o sin escribir paréntesis.


La guía de estilo del proyecto PEAR prescribe el uso de la construcción require_once en el caso de bibliotecas cuya inclusión no dependa de ninguna condición y que no se utilicen paréntesis alrededor de los nombres de las bibliotecas.

Funciones intrínsecas

Estas funciones forman parte del núcleo de una distribución de PHP. En este bloque se incluyen todas las funciones que implementan la funcionalidad básica del lenguage:

La referencia de todas las funciones de este tipo se encuentra en www.php.net

Librerías de extensiones incorporadas a la distribución de PHP

Para utilizar estas funciones, es necesario habilitar la extensión correspondiente en el fichero de configuración php.ini (Si se ejecuta un script php desde línea de comandos el fichero de configuración utilizado por defecto en una instalación debian se encuentra en «/etc/php5/cli/php.ini»; si por el contrario se ejecuta el script php como un CGI de un servidor web apache, el fichero se encuentra en «/etc/php5/apache2/php.ini).

En el fichero de configuración, se indica que se desea habilitar una determinada extensión mediante una línea de la forma:

extension=nombre_de_extension.dll (windows)

o bien

extension=nombre_de_extension.so (unix)

Entre la extensiones (también llamadas módulos) disponibles en una distribución PHP se encuentan:

Podemos consultar las extensiones incorporadas existentes en la información de referencia disponible en www.php.net

Librerías de extensiones externas

Son extensiones que requieren la instalación de librerías (bibliotecas) adicionales no incluidas en la distribución de PHP

En esta categoría se encuentran bibliotecas de interfaz con productos que ofrecen una funcionalidad muy específica:

Las extensiones existentes, tanto externas como incorporadas, se pueden consultar en la información de referencia disponible en www.php.net

Librerías de extensiones PECL

PECL es un repositorio de extensiones para PHP que alberga extensiones que implementan todo tipo de funcionalidades, entre las cuales cabe destacar:

Librerías de clases PEAR

PEAR es un repositorio de clases PHP. Estas clases pueden ser utilizadas en nuestro código mediante sentencias include (a diferencia de PECL, que es un repositorio de extensiones escritas en C, que se incorporan a PHP cuando se compila el código fuente, y se habilitan mediante directrices «extension=» en el fichero de configuración).

La variedad de clases disponibles en PEAR encapsulando determinadas funcionalidades también es muy amplia, e incluye, por ejemplo, mecanismos de pago (paypal, etc,…), manejo de streams, generación de CAPTCHA, etc.

Como podemos ver, la variedad de librerías PHP disponibles es muy grande. En próximos artículos iremos explorando las posibilidades y la forma de utilizar estas librerías.