|
|
(9 revisiones intermedias por el mismo usuario no mostrado) |
Línea 1: |
Línea 1: |
| <div id=parrafo> | | <div id=parrafo> |
− | <div class=slide>
| |
− | ==Funciones==
| |
− | <br />
| |
− | {{MRM_Objetivo|
| |
− | ;Las funciones es un elemento fundamental
| |
− | *Permite crear código modular
| |
− | *Una forma de estructurar nuestro programa
| |
− | }}
| |
− | </div>
| |
| | | |
− | <div class=slide>
| + | {{ManuelRomero/PHP/funciones}} |
− | ===Declaración de funciones===
| + | {{ManuelRomero/PHP/funcionesRecursivas}} |
− | <source lang=php>
| + | {{ManuelRomero/PHP/funcionesAnonimas}} |
− | // Declarar una función
| + | {{ManuelRomero/PHP/funcionesFlecha}} |
− | function nombre_de_funcion([tipo_de_parametro] $parametro_formal[=valor_por_defecto], ...)[: tipo_retorno]
| + | {{ManuelRomero/PHP/funciones/practica}} |
− | { | + | |
− | ...
| + | |
− | [return ...];
| + | |
− | }
| + | |
− | | + | |
− | // Llamar
| + | |
− | nombre_de_funcion($parametro_real);
| + | |
− | </source>
| + | |
− | | + | |
− | </div>
| + | |
− | <div class=slide>
| + | |
− | *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
| + | |
− | </div>
| + | |
− | | + | |
− | | + | |
− | <div class=slide>
| + | |
− | ;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_]*'''''
| + | |
− | }}
| + | |
− | </div>
| + | |
− | <div class=slide>
| + | |
− | ;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
| + | |
− | {{MRM_Puntos clave|Title=parámetros formales|
| + | |
− | Los parámetros formales son variables locales a la función}}
| + | |
− | </div>
| + | |
− | | + | |
− | ===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
| + | |
− | [[Archivo:declaracion_funcion.png]]
| + | |
− | ;Invocación de función
| + | |
− | *Es un tipo de instrucción, invocar a una acción o función.
| + | |
− | [[Archivo:invocacion_funcion_1.png]]
| + | |
− | *lo primero que ocurrirá es que voy a esa zona de memoria
| + | |
− | [[Archivo:invocacion_funcion_2.png]]
| + | |
− | *Lo siguiente es dar los valores reales (de la invocación) a los parámetros de la función (de la declaracion.
| + | |
− | [[Archivo:invocacion_funcion_3.png]]
| + | |
− | *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ó
| + | |
− | | + | |
− | | + | |
− | | + | |
− | | + | |
− | <div class=slide>
| + | |
− | {{MRM_Actividad|Title=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
| + | |
− | }} | + | |
− | </div>
| + | |
− | <div class=slide>
| + | |
− | *Una posible solución
| + | |
− | <source lang=php> <?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 />";
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | </div>
| + | |
− | | + | |
− | <div class=slide>
| + | |
− | | + | |
− | ===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
| + | |
− | </div>
| + | |
− | | + | |
− | <div class=slide>
| + | |
− | ;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
| + | |
− | <source lang=php>
| + | |
− | function nombre_funcion(&$paramRef1, &$paramRef2, $paramVal1){
| + | |
− | ...
| + | |
− | }
| + | |
− | </source>
| + | |
− | </div>
| + | |
− | | + | |
− | | + | |
− | <div class=slide>
| + | |
− | {{MRM_Actividad|Title=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
| + | |
− | }} | + | |
− | </div>
| + | |
− | <source lang=php>
| + | |
− | | + | |
− | <?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 />";
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | <div class=slide>
| + | |
− | ;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
| + | |
− | </div>
| + | |
− | | + | |
− | <div class=slide>
| + | |
− | | + | |
− | | + | |
− | {{MRM_Ejemplo|Title = ejemplo invocación a funciones| | + | |
− | {{Tip|Este código funcionará correctamente}}
| + | |
− | <source lang=php>
| + | |
− | <?php
| + | |
− | a(5,6);
| + | |
− | /*Mas instrucciones*/
| + | |
− | function a ($a, $b){
| + | |
− | echo "valor de $a";
| + | |
− | echo "valor de $b";
| + | |
− | }
| + | |
− | </source>
| + | |
− | }} | + | |
− | </div>
| + | |
− | | + | |
− | <div class=slide>
| + | |
− | | + | |
− | {{MRM_Ejemplo|Title = ejemplo invocación a funciones| | + | |
− | {{Tip|Este código no funcionará }}
| + | |
− | <source lang=php>
| + | |
− | <?php
| + | |
− | a(5,6);
| + | |
− | /*Mas instrucciones*/
| + | |
− | include ("funciones.php");
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | *Contenido del ficheor funciones.php
| + | |
− | <source lang=php>
| + | |
− | <?php
| + | |
− | function a ($a, $b){
| + | |
− | echo "valor de $a";
| + | |
− | echo "valor de $b";
| + | |
− | }
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | }} | + | |
− | </div>
| + | |
− | | + | |
− | | + | |
− | | + | |
− | <div class="slide">
| + | |
− | ===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
| + | |
− | <source lang=php>
| + | |
− | <?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 />";
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | *Vemos que genera la siguiente salida
| + | |
− | <source lang=bash>
| + | |
− | 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-
| + | |
− | </source>
| + | |
− | *Sin embargo si quieremos acceder al valor de '''''$var ''''' dentro de la función, sí que podemos
| + | |
− | *Hemos de usar la palabra reservada '''''$global'''''
| + | |
− | <source lang=php>
| + | |
− | <?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 />";
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | *Ahora podemos observar cómo sí que se accede al valor dentro de la función
| + | |
− | <source lang=bash>
| + | |
− | 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-
| + | |
− | </source>
| + | |
− | ===Funciones anónimas===
| + | |
− | <br />
| + | |
− | {{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)[https://www.php.net/manual/es/class.closure.php]
| + | |
− | ;Crear una función anónima:
| + | |
− | <source lang=php>
| + | |
− | function (){
| + | |
− | return "Hola desde una función anónima";
| + | |
− | } | + | |
− | | + | |
− | }} | + | |
− | </source>
| + | |
− | <br />
| + | |
− | {{MRM_Pregunta|
| + | |
− | ;Ahora viene la paradoja de para qué puede servir y cómo la puedo invocar.
| + | |
− | }}
| + | |
− | <br />
| + | |
− | ;Para invocar a una función anónima tenemos dos formas:
| + | |
− | :<span id=r>A través de las variables de funciones</span>
| + | |
− | :<span id=r>Como argumento en una función</span>, 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)
| + | |
− | <source lang=php>
| + | |
− | <?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,
| + | |
− | ?>
| + | |
− | | + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | | + | |
− | <source lang=php>
| + | |
− | | + | |
− | </source>
| + | |
− | ;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 <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");
| + | |
− | | + | |
− | ?>
| + | |
− | </source>
| + | |
− | | + | |
− | ===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.
| + | |
− | #
| + | |
| </div> | | </div> |