# Funciones y bibliotecas

## Funciones

En PHP se pueden definir funciones, de manera que no haga falta escribir el mismo código varias veces. 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.

Por ejemplo, el tratamiento de la matriz $_REQUEST comentada en la lección sobre recogida de datos se puede concentrar en una función.

    <?php
    function recoge($var)
    {
        $tmp = (isset($_REQUEST[$var])) ? strip_tags(trim(htmlspecialchars($_REQUEST[$var]))) : '';
        if (get_magic_quotes_gpc()) {
            $tmp = stripslashes($tmp);
        }
        return $tmp;
    }

    $nombre = recoge('nombre');
    if ($nombre == "") {
        print "<p>No ha escrito ningún nombre</p>";
    } else {
        print "<p>Su nombre es $nombre</p>";
    }
    ?>

Volver al principio de la página

## 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.

En el ejemplo siguiente, se modifica la función recoge() del ejemplo anterior para que devuelva un valor predeterminado si el script no recibe el dato correspondiente.

    <?php
    function recoge($var, $var2='')
    {
        $tmp = (isset($_REQUEST[$var])&&(trim(strip_tags($_REQUEST[$var])!=''))) ?
            strip_tags(trim(htmlspecialchars($_REQUEST[$var]))) : strip_tags(trim(htmlspecialchars($var2)));
        if (get_magic_quotes_gpc()) {
            $tmp = stripslashes($tmp);
        }
        return $tmp;
    }

    // En el ejemplo siguiente, al no enviar el segundo argumento,
    // si no existe $_REQUEST['edad'], devuelve el valor vacío.
    $edad = recoge("edad");
    if ($edad=="") {
        print "<p>No has escrito tu edad</p>";
    } else {
        print "<p>Tu edad es $edad</p>";
    }

    // En el ejemplo siguiente, al enviar el segundo argumento,
    // si no existe $_REQUEST['edad'], devuelve el segundo argumento enviado.
    $edad = recoge("edad", 0);
    if ($edad==0) {
        print "<p>No has escrito tu edad</p>";
    } else {
        print "<p>Tu edad es $edad</p>";
    }
    ?>

Volver al principio de la página

## Bibliotecas

Para que una función pueda ser utilizada en varias páginas sin tener que incluirla en cada página, se pueden crear bibliotecas, que no son más que archivos php que se pueden incluir en cualquier otro archivo. Las bibliotecas también se pueden utilizar para definir variables.

Por ejemplo, la cabecera de las páginas se puede definir en una función que está en un archivo funciones.php (el nombre puede ser cualquiera).

    <?php
    function cabecera($titulo)
    {
        print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?".">
    <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
    <html xmlns=\"http://www.w3.org/1999/xhtml\">
    <head>
      <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />
      <title>$titulo</title>
      <link href=\"estilo.css\" rel=\"stylesheet\" type=\"text/css\" />
    </head>

    <body>
    <h1>$titulo</h1>\n";
    }
    ?>

Si en cualquier documento se incluye el archivo funciones.php mediante la construcción include(), se puede llamar a las funciones desde cualquier punto del documento.

    <?php
    include "funciones.php";
    cabecera("Página de ejemplo");
    print "<p>Esta página es válida</p>";
    ?>
    </body>
    </html>

También se puede utilizar la construcción require(). La diferencia entre ambas 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).

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.