Funciones
Objetivo
- Las funciones son un elemento fundamental
- Permiten crear código modular.
- Ayudan a estructurar el programa de manera ordenada.
|
Declaración de funciones
// Declarar una función
function nombre_de_funcion([tipo_de_parametro] $parametro_formal[=valor_por_defecto], ...)[: tipo_retorno]
{
...
[return ...];
}
// Llamar
nombre_de_funcion($parametro_real);
- Es importante diferenciar entre **declarar** una función e **invocar** una función.
- Aunque parece obvio, es un punto importante.
- En la declaración de una función, tenemos tres partes:
- Nombre o identificación de la función
- Parámetros formales
- Se especifican entre paréntesis. (Los paréntesis son necesarios, aunque no haya parámetros).
- Se puede especificar el tipo de cada parámetro (a partir de la versión 7.2).
- Se puede asignar un valor por defecto (si un parámetro tiene valor por defecto, no es obligatorio proporcionarle un valor en la invocación).
- Tipo de retorno
Es opcional.
- El cuerpo de la función. Dentro de él puede estar la instrucción `return`, la cual finaliza la ejecución de la función y devuelve el flujo al programa, a la instrucción que llamó a la función.
- `return` puede (o debe) devolver el valor que queremos que la función retorne.
- Identificador de función
- El nombre de la función es un identificador que empieza por una letra o guion bajo, seguido de 0 o más letras, números o guiones bajos.
Tip: Expresión regular para el identificador de funciones:
[a-zA-Z_f_][a-zA-Z0-9_]*
- Parámetros formales
- Son nombres de variables que usaremos al escribir el código o cuerpo de la función.
- El nombre debe ser significativo y se convertirán en variables locales a la función.
- Al finalizar la función, estas variables se eliminan de la memoria.
Los parámetros formales son variables locales a la función.
|
Proceso de creación / invocación de una función
- Primero, declaramos la función
- Esto implica reservar una zona de memoria identificada con el nombre de la función.
- El contenido de esas posiciones de memoria será el conjunto de acciones de la función.
- Estas acciones estarán definidas en función de los **parámetros formales** de la declaración.
- Invocación de la función
- La invocación es una instrucción para ejecutar la función.
- Lo primero que ocurre es que el programa accede a esa zona de memoria.
- Luego, se asignan los valores reales de la invocación a los parámetros formales de la función.
- Cuando la función termina de ejecutarse, se retorna a la instrucción que sigue a la llamada.
- Si la función devuelve un valor, este se asigna a la variable de la instrucción de asignación desde la cual se invocó.
</div>
Ejercicio usando funciones
Escribe un programa en el que en el programa principal se declaren dos variables, $a y $b.
- Crea una función que reciba como parámetros locales $a y $b,
- La función debe visualizar el valor de las variables, modificarlas, y volver a visualizarlas.
- En el programa principal:
- Asigna valor a las variables.
- Visualízalas.
- Invoca la función.
- Visualiza de nuevo las variables.
|
<?php
function a($a, $b){
echo "Dentro de la función visualizando valores <hr />";
echo "Valor de los parámetros \$a = $a \$b = $b <br />";
$a += 5;
$b += 5;
echo "Valor de los parámetros \$a = $a \$b = $b <br />";
echo "Salgo de la función";
}
//Programa principal
$a = 100;
$b = 200;
echo "En el main antes de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
a($a, $b);
echo "En el main después de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
?>
Parámetros formales: Valores y referencias
- Como hemos visto, los parámetros formales reciben valores pasados en la invocación de la función.
- Si queremos que la función pueda modificar el valor de los parámetros, debemos pasarlos **por referencia**.
- Esto permite que se pase la dirección de memoria donde se guarda el valor, en lugar del valor en sí.
- En PHP no podemos visualizar ni operar con la dirección de memoria, ya que no existe la aritmética de punteros.
- Parámetros formales
- Valores y referencias
Para pasar el parámetro por referencia, simplemente coloca el símbolo & antes del nombre de la variable en la declaración de los parámetros:
function nombre_funcion(&$paramRef1, &$paramRef2, $paramVal1){
...
}
Ejercicio usando funciones y parámetros
Escribe un programa donde en el programa principal se declaren tres variables: $a, $b y $c.
- Crea una función que reciba como parámetros &$num1, &$num2 y $num3.
- La función debe visualizar el valor de las variables, modificarlas, y volver a visualizarlas.
- En el programa principal:
- Asigna valor a las variables.
- Visualízalas.
- Invoca la función.
- Visualiza de nuevo las variables.
|
<?php
function a(&$num1, &$num2, $num3){
echo "Dentro de la función visualizando valores <hr />";
echo "Valor de los parámetros \$num1 = $num1 \$num2 = $num2 \$num3 = $num3<br />";
$num1 += 5;
$num2 += 5;
$num3 += 5;
echo "Valor de los parámetros \$num1 = $num1 \$num2 = $num2 \$num3 = $num3<br />";
echo "Salgo de la función";
}
//Programa principal
$a = 100;
$b = 200;
$c = 300;
echo "En el main antes de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
a($a, $b, $c);
echo "En el main después de invocar la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
?>
- Invocando funciones
- Una vez creada una función, se puede invocar como si fuera una instrucción.
- No sin razón, en ciertos contextos se refiere a funciones como "instrucciones virtuales".
- En PHP, puedes invocar una función antes de declararla, siempre que esté en el mismo archivo.
|
Ejemplo de invocación de funciones
|
|
Tip: Este código funcionará correctamente
<?php
a(5, 6);
/*Más instrucciones*/
function a($a, $b){
echo "Valor de $a";
echo "Valor de $b";
}
|
|
Ejemplo de invocación de funciones
|
|
Tip: Este código no funcionará
<?php
a(5, 6);
/*Más instrucciones*/
include ("funciones.php");
?>
- Contenido del archivo funciones.php
<?php
function a($a, $b){
echo "Valor de $a";
echo "Valor de $b";
}
?>
|
Variables dentro de una función
- Dentro de una función, las variables que declaremos son **locales** a esa función.
- No se puede acceder a su valor fuera de la función.
- Esto también implica que dentro de una función no se puede acceder al valor de una variable definida fuera de la función.
- Observa el siguiente ejemplo:
<?php
function modifica_valor(){
echo "Valor de <b>var1</b> dentro de la función: -$var1- <br />";
$var1++;
echo "Valor de <b>var1</b> dentro de la función, modificado: -$var1- <br />";
}
$var1 = 20;
echo "Valor de <b>var1</b> en el programa principal antes de invocar la función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en el programa principal después de invocar la función: -$var1- <br />";
?>
- Genera la siguiente salida:
Valor de var1 en el programa principal antes de invocar la función: -20-
Valor de var1 dentro de la función: --
Valor de var1 dentro de la función, modificado: -1-
Valor de var1 en el programa principal después de invocar la función: -20-
- Si queremos acceder al valor de $var1 dentro de la función, podemos usar la palabra reservada global:
<?php
function modifica_valor(){
global $var1; // Indicamos que esta variable se puede usar globalmente.
echo "Valor de <b>var1</b> dentro de la función: -$var1- <br />";
$var1++;
echo "Valor de <b>var1</b> dentro de la función, modificado: -$var1- <br />";
}
$var1 = 20;
echo "Valor de <b>var1</b> en el programa principal antes de invocar la función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en el programa principal después de invocar la función: -$var1- <br />";
?>
- Ahora, observamos que el valor dentro de la función se puede acceder y modificar.
Valor de var1 en el programa principal antes de invocar la función: -20-
Valor de var1 dentro de la función: -20-
Valor de var1 dentro de la función, modificado: -21-
Valor de var1 en el programa principal después de invocar la función: -21-