Desarrollo de aplicaciones web con PHP y MySQL
Funciones en PHP
Sergio Sáez y José Luis Poza
© 2015 Sergio Sáez y José Luis Poza
1. 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);
?>
2. 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");
?>
3. 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: Call to undefined function noexiste() in - on line 2
4. 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().
- 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 - on line 2
5. 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 |
|
6. 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);
?>
<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 |
|
- 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 Warning: Missing argument 1 for muestra_tabla(), called in - on line 16 and defined i
Variable '$datos' indefinida en la función 'muestra_tabla'
7. Á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.
<?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 - 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'
- 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'
8. 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
|
9. 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 - on line 12
La función espera dos parámetros
- 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 - on line 11
10. 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("")
|
11. 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
12. 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 />
13. 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>
|