|
|
| Línea 298: |
Línea 298: |
| | Valor de var1 en el programa principal después de invocar la función: -21- | | Valor de var1 en el programa principal después de invocar la función: -21- |
| | </source> | | </source> |
| | + | |
| | + | |
| | + | {{MRM_Actividad|Title="Crear una función sobrecargada"| |
| | + | * Quiero crear una función para mostrar un valor racional. |
| | + | * Para ello necesitamos una función sobrecargada para que funcione en los siguientes casos: |
| | + | <source lang=php> |
| | + | factorial("8/7"); // => Me mostrará 8/7 |
| | + | factorial(9,6); // => Me mostrará 9/6 |
| | + | factorial(10); // => Me mostrará 10/1 |
| | + | factorial(); // => Me mostrará 1/1 |
| | + | factorial("15"); // => Me mostrará 15/1 |
| | + | |
| | + | </source> |
| | + | |
| | + | * La función debe aceptar: |
| | + | ** Una cadena con formato "a/b" |
| | + | ** Una cadena con formato "a" |
| | + | ** Dos números enteros separados |
| | + | ** Un número |
| | + | ** Ningún valor |
| | + | * Debe devolver siempre una fracción correctamente formateada. |
| | + | }} |
| | + | |
| | + | |
| | + | |
| | + | {{MRM_Actividad|Title="Login flexible con Union Types (email o ID)"| |
| | + | * Vamos a crear un formulario de inicio de sesión donde el usuario podrá: |
| | + | ** Iniciar sesión escribiendo su EMAIL |
| | + | ** O iniciar sesión escribiendo su ID numérico |
| | + | * El servidor deberá procesar ambos casos con una única función sobrecargada usando Union Types. |
| | + | * La función nos mostrará un texto u otro según el caso: |
| | + | ; Has iniciado la sesión con tu cuenta de correo xxxxx@xxx |
| | + | ; Has iniciado la sesión con tu cuenta de el ID: xxxx |
| | + | }} |
| | + | |
| | + | |
| | + | |
| | + | }} |
Última revisión de 06:02 9 dic 2025
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 dos partes
-
- Su cabecera, de la declaración
- Su contenido, es decir, lo que hace la función.
- En la cabecera de la función podemos indentificar 3 elementos
- 1.-Nombre o identificación de la 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_]*
- 2.-Parámetros formales
- Se especifican entre paréntesis. (Los paréntesis son necesarios, aunque no haya parámetros).
- Se puede (debe) especificar el tipo de cada parámetro (a partir de la versión 7.2). (Type hiding)
- Se puede incluso especificar diferentes tipos en cada parámetro (Union Type). En este caso se separa por comas
//Función que solo recibe datos de tipo int o string
//Me muestra el dato y su tipo
function mostrar_datos(int|string $dato): string
{
$tipo = gettype($dato);
return "<h1>El dato $dato es de tipo $tipo</h1>";
}
- 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).
function saludar(string $nombre = "Invitado"): string
{
return "<h1>Hola $nombre, bienvenido a nuestro sitio web</h1>";
}
- El hecho de poder dar valores por defecto, nos permitirá sobrecargar una función, es decir, que según el número y tipo de los parámetros, pueda hacer una acción/es u otra/s.
- 3.-Tipo de retorno
- Tambien se puede especificar que la función retorna diferentes valores
function sumar(int|float $a, int|float $b): int|float
{
return $a + $b;
}
- El contenido de la función
-
- Especifica el conjunto de acciones que realizará la función cuando sea invocada
- En el cuerpo de la función aparecerá 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. Esta instrucción no es obligatorio que aparezca, en el caso de que la función no retorne ningún valor puede no aparecer. Este tipo de subprogramas se conoce como procedimientos.
- return devolverá un valor del tipo que hayamos especificado.
Identificador de función
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-
"Crear una función sobrecargada"
- Quiero crear una función para mostrar un valor racional.
- Para ello necesitamos una función sobrecargada para que funcione en los siguientes casos:
factorial("8/7"); // => Me mostrará 8/7
factorial(9,6); // => Me mostrará 9/6
factorial(10); // => Me mostrará 10/1
factorial(); // => Me mostrará 1/1
factorial("15"); // => Me mostrará 15/1
- La función debe aceptar:
- Una cadena con formato "a/b"
- Una cadena con formato "a"
- Dos números enteros separados
- Un número
- Ningún valor
- Debe devolver siempre una fracción correctamente formateada.
|
"Login flexible con Union Types (email o ID)"
- Vamos a crear un formulario de inicio de sesión donde el usuario podrá:
- Iniciar sesión escribiendo su EMAIL
- O iniciar sesión escribiendo su ID numérico
- El servidor deberá procesar ambos casos con una única función sobrecargada usando Union Types.
- La función nos mostrará un texto u otro según el caso:
- Has iniciado la sesión con tu cuenta de correo xxxxx@xxx
- Has iniciado la sesión con tu cuenta de el ID
- xxxx
|
}}