Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/INAEM2021/Funciones»

De WikiEducator
Saltar a: navegación, buscar
(Página reemplazada por «{{:Usuario:ManuelRomero/ProgramacionWeb/INAEM2021/Funciones/nav}}»)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/ProgramacionWeb/INAEM2021/Funciones/nav}}
 
{{:Usuario:ManuelRomero/ProgramacionWeb/INAEM2021/Funciones/nav}}
<div class=parrafo>
 
==Funciones==
 
<br />
 
{{MRM_Objetivo|
 
;Las funciones es un elemento  fundamental
 
*Permite crear código modular
 
*Una forma de estructurar nuestro programa
 
}}
 
;Qué son las funciones
 
{{MRM_Definicion|
 
*Una función es una declaración de un conjunto de instrucciones que indentificamos  con un nombre, al que le vamos a asignar una serie de acciones o instrucciones y de su ejecución podemos o no obtener un valor como resultado de su ejecución
 
}}
 
{{MRM_Puntos clave |Title =Son muy importantes|
 
;Las funciones son la base de la programación modular:
 
Creamos nuestro programa como módulos que van haciendo acciones
 
;Una función agrupa una serie de instrucciones relacionadas semáticamente
 
Por ejemplo mostrar_menu(), validar_usuario($usuario), dame_numero_par()
 
;El identificador a de ser significativo semánticamente
 
Solo con leer el identificado debemos intuir qué hace esa función
 
;Va a evitar duplicar código
 
Si vemos un conjunto de accinoes que repetimos muchas veces,
 
va a ser un claro indicador de que debemos de crear una función
 
;Va a permitir hacer código más legible
 
Un código mucho más fácil de leer
 
;Es una decisión del programador
 
No debemos obsesionarnos con crear funciones.
 
Surgirán según las veamos y concivamos,
 
;Son una herramienta para facilitarnos crear el código, no para complicarnos buscando dónde poder poner una función
 
}}
 
{{MRM_Puntos clave |Title =Valor de retorno:Acciones o Procedimientos|
 
;Existen una diferencia en cuanto a que retorne o no un valor
 
*Es este un concepto matemático:
 
Si una función no retorna valor, en realidad se llama procedimiento
 
  <source lang=php>
 
  function saludo(){
 
    echo "Hola cómo estás";
 
  }
 
</source>
 
Si una función devuelve un valor, es propiamente una función
 
*En otros lenguajes de programación, existe la diferencia entre función y procedimiento. En php no
 
*Cuando una función retorna un valor, usamos la palabra reservada '''''return'''''
 
}}
 
{{MRM_Puntos clave |Title =Los parámetros|
 
;A una función le podemos pasar una serie de valores para que haga algo
 
*Estos valores que le pasamos se llaman Parámetros
 
* por ejemplo
 
<source lang=php>
 
function sumar ( $num1, $num2){
 
  $suma = $num1+$num2;
 
  return $num1+$num2;
 
}
 
</source>
 
}}
 
Creamos nuestro programa como módulos que van haciendo acciones
 
;Una función agrupa una serie de instrucciones relacionadas semáticamente
 
Por ejemplo mostrar_menu(), validar_usuario($usuario), dame_numero_par()
 
;El identificador a de ser significativo semánticamente
 
Solo con leer el identificado debemos intuir qué hace esa función
 
;Va a evitar duplicar código
 
Si vemos un conjunto de accinoes que repetimos muchas veces,
 
va a ser un claro indicador de que debemos de crear una función
 
;Va a permitir hacer código más legible
 
Un código mucho más fácil de leer
 
;Es una decisión del programador
 
No debemos obsesionarnos con crear funciones.
 
Surgirán según las veamos y concivamos,
 
;Son una herramienta para facilitarnos crear el código, no para complicarnos buscando dónde poder poner una función
 
}}
 
 
 
<div class=slide>
 
===Declaración de funciones===
 
<source lang=php>
 
function nombreFuncion ($paramFormal1, $paramFormal2 ,...){
 
  //Instrucciones de la función
 
  return $valorRetorno //Opcionalmente en caso de que devuelva algún valor la función
 
}
 
</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 funciones
 
#parámetros formales entre paréntesis (Estos han de existir, aunque no haya parámetros)
 
#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.
 
</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
 
*Ĥemos 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>
 
</div>
 
</div>
 

Revisión de 17:03 13 dic 2023