Usuario:ManuelRomero/ProgramacionWeb/funciones

De WikiEducator
Saltar a: navegación, buscar

Funciones



Icon objectives.jpg
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
  1. 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.
  2. 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
Icon present.gif
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


Icon key points.gif

parámetros formales

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

Declaracion funcion.png

Invocación de función
  • Es un tipo de instrucción, invocar a una acción o función.

Invocacion funcion 1.png

  • lo primero que ocurrirá es que voy a esa zona de memoria

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.

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ó




Icon activity.jpg
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
  1. asignará valor a las variables
  2. las visualizará
  3. invocará a la función
  4. volverá a visualizar las variables



  • Una posible solución
    <?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){
   ...
}



Icon activity.jpg
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
  1. asignará valor a las variables
  2. las visualizará
  3. invocará a la función
  4. 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



Icon casestudy.gif
ejemplo invocación a funciones
Icon present.gif
Tip: Este código funcionará correctamente


    <?php
      a(5,6);  
      /*Mas instrucciones*/
      function a ($a, $b){
          echo "valor de $a";
          echo "valor de $b";
      }




Icon casestudy.gif
ejemplo invocación a funciones
Icon present.gif
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



Icon define.gif
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";
}





Icon qmark.gif
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.