Desarrollo de aplicaciones web con PHP y MySQL
Funciones en PHP
Sergio Sáez y José Luis Poza
E.T.S. de Ingeniería Informática
Funciones en PHP
- Están pensadas para separar el código que realiza una tarea bien definida.
- Facilita la lectura del código.
- Permite la reutilización de código.
- Tienen una interfaz bien definida, realizan una tarea concreta y, posiblemente, devuelven un valor de retorno.
- Se invocan de la forma habitual
<?php
nombre_funcion_1();
nombre_funcion_2(25);
nombre_funcion_3(34, $variable, "Hola");
$respuesta= nombre_funcion_4($variable *3);
?>
Interfaz de una función
<?php resource fopen(string filename, string mode
[, bool use_include_path]); ?>
- La interfaz indica qué parámetros recibe una función, de qué tipo y si devuelve algún valor y de qué tipo.
- Sólo es a nivel de documentación.
- También indica si alguno de los parámetros es opcional.
- Si un parámetro opcional no se especifica en la invocación, tomará un valor predeterminado en la definición de la función.
<?php
$handle = fopen("file.txt", "r", true);
$handle = fopen("/home/ssaez/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
Errores de invocación
- Si se intenta invocar una función que no existe se produce un error fatal en el interprete de PHP.
- Causas:
- Error tipográfico en el nombre de la función.
- La función no existe en la versión utilizada de PHP.
- La función pertenece a una librería que no se ha cargado.
<?php
$var= noexiste(25);
?>
PHP Fatal error: Uncaught Error: Call to undefined function noexiste() in Standard input code:2
Stack trace:
#0 {main}
thrown in Standard input code on line 2
Definición de funciones
- Una función se define utilizando la palabra clave function.
|
<?php function mi_funcion() { echo "Se ha invocado mi función\n"; } // end mi_funcion ?>
|
<?php function mi_funcion() { ?> Se ha invocado mi función <?php } // end mi_funcion ?>
|
- Las funciones internas de PHP están disponibles en todos los scripts.
- Las funciones definidas por el usuario sólo están disponibles en el script en el que se definen.
- Las funciones comunes es habitual ponerlas en un módulo que se incluye en cada script con require().
Definición de funciones (cont.)
- El nombre de una función:
- No puede coincidir con el nombre de una función que ya exista.
- Sólo puede contener letras, dígitos y subrayados, pero no puede comenzar por un dígito.
- No es sensible a mayúsculas y minúsculas, pero es una buena práctica ser consistente con los nombres.
|
Nombres válidos
<?php nombre(); nombre2(); nombre_tres(); _nombre_cuatro(); ?>
|
Nombres erroneos
<?php 5nombre(); nombre-seis(); fopen(); // Válida, pero ya está definida ?>
|
PHP Parse error: syntax error, unexpected 'nombre' (T_STRING) in Standard input code on line 2
Funciones con parámetros
- Los parámetros permiten pasarles datos a las funciones.
- Los parámetros no tienen un tipo definido.
|
<?php function muestra_tabla($datos) { echo "<table border='1'>\n";
$valor= reset($datos); while ($valor !== false) { echo "<tr><td>$valor</td></tr>\n"; $valor= next($datos); } // endwhile
echo "</table>\n"; } // end muestra_tabla
$mis_datos= array("Fila uno", "Fila dos", "Fila tres"); muestra_tabla($mis_datos); ?>
|
<table border='1'>
<tr><td>Fila uno</td></tr>
<tr><td>Fila dos</td></tr>
<tr><td>Fila tres</td></tr>
</table>
| Fila uno |
| Fila dos |
| Fila tres |
|
Parámetros opcionales
- Los parámetros opcionales son aquellos para los que hay definido un valor predeterminado.
- Se pueden omitir, todos o sólo algunos, pero en el mismo orden en el que se han declarado.
<?php
function muestra_tabla($datos, $border=1, $cellpadding=4, $cellspacing=4) {
echo "<table border='$border' cellpadding='$cellpadding' ";
echo "cellspacing='$cellspacing'>\n";
$valor= reset($datos);
while ($valor !== false) {
echo " <tr><td>$valor</td></tr>\n";
$valor= next($datos);
} // endwhile
echo "</table>\n<br>\n";
} // end muestra_tabla
$mis_datos= array("Fila uno", "Fila dos", "Fila tres");
muestra_tabla($mis_datos);
muestra_tabla($mis_datos, 4);
muestra_tabla($mis_datos, 4, 8, 8);
?>
Parámetros opcionales (cont.)
<table border='1' cellpadding='4' cellspacing='4'>
<tr><td>Fila uno</td></tr>
<tr><td>Fila dos</td></tr>
<tr><td>Fila tres</td></tr>
</table>
<br>
<table border='4' cellpadding='4' cellspacing='4'>
<tr><td>Fila uno</td></tr>
<tr><td>Fila dos</td></tr>
<tr><td>Fila tres</td></tr>
</table>
<br>
<table border='4' cellpadding='8' cellspacing='8'>
<tr><td>Fila uno</td></tr>
<tr><td>Fila dos</td></tr>
<tr><td>Fila tres</td></tr>
</table>
<br>
|
| Fila uno |
| Fila dos |
| Fila tres |
| Fila uno |
| Fila dos |
| Fila tres |
| Fila uno |
| Fila dos |
| Fila tres |
|
Parámetros opcionales (cont.)
- Si no se le pasan los parámetros obligatorios dará un warning, pero aun así ejecutará la función.
<?php
function muestra_tabla($datos, $border=1, $cellpadding=4, $cellspacing=4) {
if (!isset($datos))
die("Variable '\$datos' indefinida en la función 'muestra_tabla'");
echo "<table border='$border' cellpadding='$cellpadding' ";
echo "cellspacing='$cellspacing'>\n";
$valor= reset($datos);
while ($valor !== false) {
echo " <tr><td>$valor</td></tr>\n";
$valor= next($datos);
} // endwhile
echo "</table>\n<br>\n";
} // end muestra_tabla
$mis_datos= array("Fila uno", "Fila dos", "Fila tres");
muestra_tabla();
?>
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function muestra_tabla(), 0 passed in Standard input code on line 16 and at least 1 expected in Standard input code:2
Stack trace:
#0 Standard input code(16): muestra_tabla()
#1 {main}
thrown in Standard input code on line 2
Ámbito de las variables
- El ámbito de una variable determina si es visible y se puede utilizar.
- Ámbito de las variables:
- Local
- Las variables que se crean dentro de una función sólo son accesibles desde el punto en que se crean hasta el final de la misma.
- Global
- Las variables que se crean fuera de una función son accesibles desde el punto en que se crean hasta el final del fichero, pero no en las funciones.
Ámbito de las variables (cont.)
<?php
$var= "Contenido original";
function una_funcion() {
echo "Dentro de la función: \$var = '$var' <br>\n";
$var= "Nuevo contenido";
echo "Dentro de la función: \$var = '$var' <br>\n";
}
$var= "Contenido antes de la función";
una_funcion();
echo "Fuera de la función: \$var = '$var' <br>\n";
?>
PHP Notice: Undefined variable: var in Standard input code on line 5
Dentro de la función: $var = ''
Dentro de la función: $var = 'Nuevo contenido'
Fuera de la función: $var = 'Contenido antes de la función'
Ámbito de las variables (cont.)
- La construcción global permite modificar el ámbito de una variable.
<?php
function una_funcion() {
global $var;
echo "Dentro de la función: \$var = '$var' <br>\n";
$var= "Nuevo contenido";
echo "Dentro de la función: \$var = '$var' <br>\n";
}
$var= "Contenido original";
una_funcion();
echo "Fuera de la función: \$var = '$var' <br>\n";
?>
Dentro de la función: $var = 'Contenido original'
Dentro de la función: $var = 'Nuevo contenido'
Fuera de la función: $var = 'Nuevo contenido'
Paso de variables por referencia
- Cuando se le pasa una variable a una función, normalmente se pasa por valor (se pasa una copia).
|
<?php function incremento($valor, $inc = 1) { $valor = $valor + $inc; } // end incremento $val= 10; incremento($val); echo $val; ?>
|
10
|
- En el paso por referencia (&) la función no recibe una copia, sino una referencia a la variable.
|
<?php function incremento(&$valor, $inc = 1) { $valor = $valor + $inc; } // end incremento $val= 10; incremento($val); echo $val; ?>
|
11
|
Volviendo de una función
- La orden return termina la ejecución de una función.
- Se puede utilizar para devolver un valor o para la terminación anticipada de una función.
<?php
function mayor($x, $y) {
if (!isset($x) || !isset($y)) {
echo "La función espera dos parámetros\n";
return ;
}
echo (($x > $y) ? $x : $y) . "\n";
}
list($a, $b, $c)= array(1, 2.5, 1.9);
mayor($a, $b);
mayor($a, $c);
mayor($a, $d);
?>
2.5
1.9
PHP Notice: Undefined variable: d in Standard input code on line 12
La función espera dos parámetros
Volviendo de una función (cont.)
- return se utiliza para devolver valores de una función.
- Una función puede devolver cualquier valor, incluyendo vectores.
- El tipo de lo devuelto por una función no tiene porque ser siempre del mismo tipo.
<?php
function mayor($x, $y) {
if (!isset($x) || !isset($y)) {
return false;
} else
return (($x > $y) ? $x : $y);
}
list($a, $b, $c)= array(1, 2.5, 1.9);
$max= mayor($a, $b);
if ($max !== false) echo $max . "\n";
$max= mayor($a, $d);
if ($max !== false) echo $max . "\n";
?>
2.5
PHP Notice: Undefined variable: d in Standard input code on line 11
Funciones recursivas
- Las funciones recursivas están permitidas en PHP
- Una función recursiva es aquella que se invoca a si misma.
- Los algoritmos implementados mediante funciones recursivas consumen más recursos que los iterativos.
|
<?php function reverse_r($str) { if (strlen($str) > 0) reverse_r(substr($str,1)); echo substr($str, 0, 1); } reverse_r("Hola mundo!"); ?>
Muestra:
!odnum aloH
|
Se ejecutan:
reverse_r("Hola mundo!")
reverse_r("ola mundo!")
reverse_r("la mundo!")
reverse_r("a mundo!")
reverse_r(" mundo!")
reverse_r("mundo!")
reverse_r("undo!")
reverse_r("ndo!")
reverse_r("do!")
reverse_r("o!")
reverse_r("!")
reverse_r("")
|
Funciones anidadas
- Las funciones anidadas están permitidas en PHP
- Las funciones internas sólo existen una vez que se ha invocado la función que los contiene.
- El ámbito de las funciones anidadas es global.
- No se recomienda el uso de esta característica.
<?php
function saludo() {
function hola() {
return "Hola";
}
echo hola() . " a todos.\n";
}
// $a= hola(); # Causaría un error fatal ya que todavía no está definida
saludo();
echo hola(); /* Ya se puede invocar, puesto que se
ha definido al invocar a saludo() */
?>
Hola a todos.
Hola
Funciones variables
- Se puede invocar a una función poniendo su nombre en una variable de tipo string.
<?php
function foo() {
echo "Ejecutando foo()<br />\n";
}
function bar($arg = '')
{
echo "Ejecutando bar(); el parámetro es '$arg'.<br />\n";
}
$func = 'foo';
$func(); // Esto invoca a foo()
$func = 'bar';
$func('test'); // Esto invoca a bar()
?>
Ejecutando foo()<br />
Ejecutando bar(); el parámetro es 'test'.<br />
Invocando métodos de objetos
- La invocación de:
- un método de un objeto: objeto->metodo.
- un método estático de una clase: clase::metodo o objeto->metodo.
<?php class mensaje { static function line ($msg){ echo $msg . "<br>\n"; } function par($msg) { echo "<p>$msg</p>\n"; } }
mensaje::line("Método estático de clase!");
$t= new mensaje; $t->par("Método de objeto!"); $t->line("Método estático de objeto!"); ?>
|
Método estático de clase!<br>
<p>Método de objeto!</p>
Método estático de objeto!<br>
|