|
|
Línea 336: |
Línea 336: |
| ;Invocación usando la función como un parámetro en otra función | | ;Invocación usando la función como un parámetro en otra función |
| *Esto se puede conseguir ver, usando alguna función del sistema que espere recibir una función de clausura, como iremos viendo a lo largo del curso. | | *Esto se puede conseguir ver, usando alguna función del sistema que espere recibir una función de clausura, como iremos viendo a lo largo del curso. |
− | [spl_autoload_register](https://www.php.net/manual/es/function.spl-autoload-register.php) | + | spl_autoload_register(https://www.php.net/manual/es/function.spl-autoload-register.php) |
| + | array_walk (https://www.php.net/manual/es/function.array-walk.php) |
| + | array_map (https://www.php.net/manual/es/function.array-map.php) |
| + | array_reduce (https://www.php.net/manual/es/function.array-reduce.php) |
| | | |
| + | *Otra forma de utilizarlo, es usando la función <span id=r>call_user_func</span>, con esta función invocamos a una función anónima, necesitamos acceder a ello, y lo podemos hacer a través de un identificador, o escribiendo el código de la funćión anónima |
| + | <source lang=php> |
| + | <?php |
| + | call_user_func(function ($nombre){echo "hola $nombre";}, "Manuel"); |
| | | |
| + | //Este código nos escribirá "hola Manuel"; |
| + | ?> |
| + | </source> |
| + | *Podríamos implementar el código anterior usando variables, posiblemente se puede considerar que mejoraríamos en legibilidad |
| + | <source lang=php> |
| + | <?php |
| + | $saludar = function ($nombre){ |
| + | echo "hola $nombre"; |
| + | }; |
| | | |
| + | call_user_func($saludar, "Manuel"); |
| | | |
− | *Uso como valor de una variable
| + | ?> |
− | *Uso de variables externas en la función con la palabra '''''use''''' (puede ser por valor o por referencia)
| + | </source> |
| | | |
| ===Funciones flecha=== | | ===Funciones flecha=== |
Funciones
Objetivo
- Las funciones es un elemento fundamental
- Permite crear código modular
- Una forma de estructurar nuestro programa
|
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 a una función
- Algo obvio, pero importante
- En la declaración tenemos tres partes
- nombre o identificación de la función
- parámetros_formales
- Se especifican entre paréntesisi(Estos han de existir, aunque no haya parámetros)
- Se puede especificar el tipo de cada parámetro (a partir de versión 7.2)
- Se puede asignar un valor por defecto (En este caso podría no aportarse valor para este parámetro en la invocación)
- Tipo de retorno
Es opcional
- Cuerpo de la función, dentro de él puede estar la instrucción return, en cuyo momento termina la ejecución de la función y se vuelve a la siguiente instrucción del programa, siguiente a la invocación de la función.
- El return puede (debe) aportar el valor que queremos que la función retorno
- Identificador de función
- El nombre de función es un identificador que empieza por una letra o guión bajo, seguido 0 o muchas 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 usaré al escribir el código o cuerpo de la función
- El nombre ha de ser significativo y se convertirán en variables locales a la función
- Una vez que se termina la función estas variables desaparecerán de memoria
Los parámetros formales son variables locales a la función
|
Proceso de creación / invocación de una función
- Lo primero es declarar una función
- Esto implica dejar una zona de memoria identificada con el nombre de la función
- En contenido de esas posiciones de memoria serán las acciones de la función
- Estas acciones estarán establecidas no con valores reales, sino con los parámetros de la declaración
- Estos parámetros se conocen como parámetros formales
- Invocación de función
- Es un tipo de instrucción, invocar a una acción o función.
- lo primero que ocurrirá es que voy a esa zona de memoria
- Lo siguiente es dar los valores reales (de la invocación) a los parámetros de la función (de la declaracion.
- Una vez que la función termina de ejecutarse, se retornará a la instrucción siguiente de la invocación
- Si la función devuelve algún valor, se recogerá y asignará a la variable de la instrucción de asignación desde la cual se invocó
Ejercicio usando funciones
Haz un programa donde en el programa principal se creen dos variables $a y $b
- Crea una función que reciba como parámetros locales $a y $b
- La función visualizará el valor de las variables, las modificará y las volverá a visualizar
- El programa principal
- asignará valor a las variables
- las visualizará
- invocará a la función
- volverá a visualizar 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";
}
//Ahora considero programa principal
$a=100;
$b=200;
echo "En el main antes de invocar a la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
a($a,$b);
echo "En el mail después de invocar a la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b <br />";
?>
Parámetros formales: Valores y referencias
- Cómo hemos visto, los parámetros formales son valores pasados en la invocación a la función
- Si queremos que la función pueda modificar el valor de los valores de los parámetros, en este caso hemos de pasarlos por referencia
- En este caso lo que ocurre en realidad es que pasamos la dirección de memoria dónde se guarda el valor.
- La dirección de memoria, no la podremos visualizar ni operar con ella, pues en php no existe la aritmética de punteros o direcciones de memoria
- Parámetros formales
- Valores y referencias
Para pasar el parámetro por referencia, simplemente hay que poner el símbolo de dirección de memoria & antes del nombre de la variable en la declaración de parámetros
function nombre_funcion(&$paramRef1, &$paramRef2, $paramVal1){
...
}
Ejercicio usando funciones parámetros
Haz un programa donde en el programa principal se creen dos variables $a y $b y $c
- Crea una función que reciba como parámetros locales &$num1,&$num2 y $num3
- La función visualizará el valor de las variables, las modificará y las volverá a visualizar
- El programa principal
- asignará valor a las variables
- las visualizará
- invocará a la función
- volverá a visualizar las variables
|
<?php
function a(&$num1, &$num2, $num3){
echo "Dentro de la función visibilizando 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";
}
//Ahora considero programa principal
$a=100;
$b=200;
$c=300;
echo "En el main antes de invocar a la función visualizando variables<hr />";
echo "Valor de variables \$a = $a \$b = $b \$c = $c <br />";
a($a,$b,$c);
echo "En el mail después de invocar a 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 la podemos invocar como si fuera una instrucción del lenguaje
- No sin razón en determinados ambientes se conoce a las funciones y procedimientos como instrucciones virtuales ...
- En php puedo invocar a una función antes de declararla, siempre que la declare en el mismo fichero
|
ejemplo invocación a funciones
|
|
Tip: Este código funcionará correctamente
<?php
a(5,6);
/*Mas instrucciones*/
function a ($a, $b){
echo "valor de $a";
echo "valor de $b";
}
|
|
ejemplo invocación a funciones
|
|
Tip: Este código no funcionará
<?php
a(5,6);
/*Mas instrucciones*/
include ("funciones.php");
?>
- Contenido del ficheor 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 podré acceder a su valor fuera de la función
- Esto también implica que dentro de una función no puedo 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 función -$var1- <br /> ";
$var1++;
echo "Valor de <b>var1</b> dentro de función moficada -$var1- <br /> ";
}
$var1 = 20;
echo "Valor de <b>var1</b> en programa principal antes de invocar función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en progrma principal después de invocar la función: -$var1- <br />";
?>
- Vemos que genera la siguiente salida
Valor de var1 en programa principal antes de invocar función: -20-
Valor de var1 dentro de función --
Valor de var1 dentro de función moficada -1-
Valor de var1 en progrma principal después de invocar la función: -20-
- Sin embargo si quieremos acceder al valor de $var dentro de la función, sí que podemos
- Hemos de usar la palabra reservada $global
<?php
function modifica_valor(){
global $var1; //Indicamos que esta variables se puede globalizar
echo "Valor de <b>var1</b> dentro de función -$var1- <br /> ";
$var1++;
echo "Valor de <b>var1</b> dentro de función moficada -$var1- <br /> ";
}
$var1 = 20;
echo "Valor de <b>var1</b> en programa principal antes de invocar función: -$var1- <br />";
modifica_valor();
echo "Valor de <b>var1</b> en progrma principal después de invocar la función: -$var1- <br />";
?>
- Ahora podemos observar cómo sí que se accede al valor dentro de la función
Valor de var1 en programa principal antes de invocar función: -20-
Valor de var1 dentro de función -20-
Valor de var1 dentro de función moficada -21-
Valor de var1 en progrma principal después de invocar la función: -21-
Funciones anónimas
{{MRM_definicion|Title=Qué son|
- Son funciones que no tienen nombre
- Se conocen como (funciones de clousura funciones cierre), y de hecho implementa la clase (Clousura)[1]
- Crear una función anónima
-
function (){
return "Hola desde una función anónima";
}
}}
Pregunta
- Ahora viene la paradoja de para qué puede servir y cómo la puedo invocar.
|
- Para invocar a una función anónima tenemos dos formas
-
- A través de las variables de funciones
- Como argumento en una función, o sea que el parámetro de una función sea otra función
- Variables de funciones
- Declaro una variable y le asigno una función
- En realidad es una forma diferente de declarar la función e invocarla, tiene la ventaja de gestionar todo como variables (posible comodidad por parte del programador)
- Si uso esta técnica, no puedo invocar a la función antes de su declaración (ya que no existe en contenido de la variable)
- Consiste en declarar una variable y asiganer la función
- Posteriormente podré invocar la función a través de la variable (he de poner también paréntesis en la invocación y no olvidar el ; (punto y coma) en la asignación)
<?php
$mi_funcion = function () {
return "hola caracola";
};
d
echo $mi_funcion();
//imprimiría "hola caracola"
//=====================================
echo $mi_funcion();
$mi_funcion = function () {
return "hola caracola";
};
//Este código fallaría,
//=====================================
<?php
echo mi_funcion();
function mi_funcion () {
return "hola caracola";
};
//Este código funcionaría, php legunaje de doble pasada en su interpretación,
?>
- Invocación usando la función como un parámetro en otra función
- Esto se puede conseguir ver, usando alguna función del sistema que espere recibir una función de clausura, como iremos viendo a lo largo del curso.
spl_autoload_register(https://www.php.net/manual/es/function.spl-autoload-register.php)
array_walk (https://www.php.net/manual/es/function.array-walk.php)
array_map (https://www.php.net/manual/es/function.array-map.php)
array_reduce (https://www.php.net/manual/es/function.array-reduce.php)
- Otra forma de utilizarlo, es usando la función call_user_func, con esta función invocamos a una función anónima, necesitamos acceder a ello, y lo podemos hacer a través de un identificador, o escribiendo el código de la funćión anónima
<?php
call_user_func(function ($nombre){echo "hola $nombre";}, "Manuel");
//Este código nos escribirá "hola Manuel";
?>
- Podríamos implementar el código anterior usando variables, posiblemente se puede considerar que mejoraríamos en legibilidad
<?php
$saludar = function ($nombre){
echo "hola $nombre";
};
call_user_func($saludar, "Manuel");
?>
Funciones flecha
- Las funciones flecha es una forma más corta de escribir funciones anónimas simples
Aparece en php en la versión 7.4
- Limitaciones de funciones flecha.
-