Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/funciones»

De WikiEducator
Saltar a: navegación, buscar
 
(14 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
<div id=parrafo>
+
__NOEDITSECTION__
<div class=slide>
+
__NOTOC__
==Funciones==
+
{{:Usuario:ManuelRomero/ProgramacionWeb/Funciones/nav}}
<br />
+
{{MRM_Objetivo|
+
;Las funciones es un elemento  fundamental
+
*Permite crear código modular
+
*Una forma de estructurar nuestro programa
+
}}
+
</div>
+
 
+
<div class=slide>
+
===Declaración de funciones===
+
<source lang=php>
+
// 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);
+
</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]
+
 
+
 
+
 
+
 
+
*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)
+
 
+
===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>
+

Última revisión de 10:30 5 dic 2025