Diferencia entre revisiones de «Usuario:ManuelRomero/CertificadoWeb2021/IntroduccionPHP/funciones»

De WikiEducator
Saltar a: navegación, buscar
 
(12 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/CertificadoWeb2021/introduccionPHP/nav}}
 
{{:Usuario:ManuelRomero/CertificadoWeb2021/introduccionPHP/nav}}
==Funciones==
+
===Funciones de fechas===
 +
*En php hay muchas fucniones para gestionar fechas, siendo esta una tarea frecuente el las aplicaciones web.
 +
{{MRM_Web|Title=Referencias de funciones de fechas en php|
 +
;https://www.php.net/manual/es/ref.datetime.php
 +
}}
 +
*Vamos a estudiar 5  funciones siendo dos de ellas muy utilizadas
 +
{{MRM_Actividad|Title=Funciones de fechas|
 +
time() https://www.php.net/manual/es/function.time.php
 +
date(formato, [timestamp]) https://www.php.net/manual/es/function.date.php
 +
strtotime("fecha_string"[timestamp]) https://www.php.net/manual/es/function.strtotime.php
 +
strftime(formato, [timestamp]) https://www.php.net/manual/es/function.strftime.php
 +
checkdate(mes, dia, año) https://www.php.net/manual/es/function.checkdate.php
 +
}}
 
<br />
 
<br />
{{MRM_Objetivo|
+
*En php se trabaja mucho con las fechas. Para tal cometido existe una clase llamada DateTime y DateTimeInterface (https://www.php.net/manual/es/class.datetime.php), pero muchas de sus acciones se pueden hacer de forma imperativa con funciones que vamos a ver.
;Las funciones es un elemento fundamental
+
====time()====
*Permite crear código modular
+
  Obtiene una marca de tiempo
*Una forma de estructurar nuestro programa
+
https://www.php.net/manual/es/function.time.php
 +
*Esta es una función muy importante en php que conviene entender bien.
 +
*Me retorna el número de segundos transcurridos desde el 1 de Enero de 1970 00:00:00 GMT.
 +
Esta fecha está relacionada con el sistema operativo UNIX que empezó a hacerse visible a partir del año 1970
 +
{{MRM_Web|Title = Un podo de historia desde wikipedia|
 +
https://es.wikipedia.org/wiki/Berkeley_Software_Distribution
 +
https://es.wikipedia.org/wiki/Unix
 
}}
 
}}
</div>
+
<br />
 
+
*La función time retorna un entero largo numérico
<div class=slide>
+
{{MRM_Actividad|Title=usar time()|
===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>
+
*Prueba a visualizar el retorno de la función '''''time()'''''
;Identificador de función
+
*Mira lo que ocurre si recargas la página en ejecución, como se van actualizando los segundos
* 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  
+
{{MRM_Pregunta|
{{Tip|Expresión regular para el identificador de funciones
+
;Entiendes por qué camba el valor
'''''[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ó
 
  
 +
{{Plegable|hide|Porbando time()|
 +
<source lang=php
 +
<?php
 +
$tiempo = time();
  
 
+
echo "<h2>Segundos transcurridos desde 1 de enero de 1970 <span style='color:red'>$tiempo </span></h2>";
 
+
<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>
 
</source>
</div>
 
  
<div class=slide>
+
}}
 +
}}
 +
<br />
 +
====date()====
  
===Parámetros formales: Valores y referencias===
+
*La función convierte un timestamp en una fecha como cadena de caracteres con el formato que le especifiquemos
*Cómo hemos visto, los parámetros formales son valores pasados en la invocación a la función
+
*Para ver los '''''metaracteres''''' que representan el formato puedes ver la referencia web de 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
+
Esta función admite dos parámetros, uno de ellos es obligatoria
*En este caso lo que ocurre en realidad es que pasamos la dirección de memoria dónde se guarda el valor.
+
{{MRM_Actividad|Title=funcion date()|
*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
+
data("formato_fecha", "timestamp")
</div>
+
;parámetro 1: formato_fecha
 
+
Es un string formado por metacaracteres y caracteres literales que establece el formato en el cual queremos ver la fecha (d/m/y H:i:s), por ejemplo, donde  '''''d''''' representa el número de día, '''''m''''' del mes ... y los caracteres '''''/''''' y ''''':''''' apareceran literales en la cadena
<div class=slide>
+
;parametro 2: timestamp
;Parámetros formales: Valores y referencias
+
Es una fecha en formato timestamp o entero largo como segundos desde una fecha
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
+
Si no se establece, se toma el instante actual, es decir el resultado de la función time()
 +
}}
 +
{{MRM_Actividad|Title=Ejemplo de uso de date|
 
<source lang=php>
 
<source lang=php>
function nombre_funcion(&$paramRef1, &$paramRef2, $paramVal1){
+
<?php
  ...
+
}
+
</source>
+
</div>
+
  
 +
$fecha_actual =date("d/m/Y H:i:s");
 +
echo "<h1>La fecha actual es $fecha_actual</h1>";
  
<div class=slide>
+
$fecha_futura =date("d/m/Y H:i:s", time()+24*60*60);
{{MRM_Actividad|Title=Ejercicio usando funciones parámetros|
+
echo "<h1>La fecha de mañana será  $fecha_futura</h1>";
'''''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>
 
</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>
+
}}
  
 
+
<br />
{{MRM_Ejemplo|Title = ejemplo invocación a funciones|
+
====strtotime()====
{{Tip|Este código funcionará correctamente}}
+
Convierte un string a fecha. https://www.php.net/manual/es/function.strtotime.php
<source lang=php>
+
*Esta función admite dos parámetros, uno de ellos es obligatoria
    <?php
+
{{MRM_Actividad|Title=funcion strtotime|
      a(5,6);   
+
strtotime("fecha_como_string", "timestamp")  
      /*Mas instrucciones*/
+
;parámetro 1: fecha_como_string
      function a ($a, $b){
+
  Es una cadena que representa una fecha
          echo "valor de $a";
+
Debemos facilitarla con el formato que entienda el sistema
          echo "valor de $b";
+
Por defecto "mes/dia/year"
      }
+
;parametro 2: timestamp (opcional, si no se aporta, se toma el valor que retorno '''''time()'''''
</source>
+
Es una fecha en formato timestamp o entero largo como segundos desde una fecha
 +
{{Tip|Recuerda que stamptime es un entero largo que respresenta un número de segundos desde el 1 de enero de 1970}}
 
}}
 
}}
</div>
 
  
<div class=slide>
 
  
{{MRM_Ejemplo|Title = ejemplo invocación a funciones|
+
;Si quisiéramos cambiar el formato, podemos usar la función data_default_timezone_set("Zona_horaria")
{{Tip|Este código no funcionará }}
+
  Descripción de la función https://www.php.net/manual/es/function.date-default-timezone-set.php
 +
Listado agrupado de diferentes zonas horarias https://www.php.net/manual/es/timezones.php
 +
*Por ejemplo
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
      a(5,6);
+
$dia= 27;
      /*Mas instrucciones*/
+
$mes = 12;
      include ("funciones.php");
+
$year = 2001;
?>
+
 
 +
$fecha_string="$dia-$mes-$year";
 +
date_default_timezone_set('Europe/Madrid');
 +
$tiempo = strtotime($fecha_string);
 +
echo "<h1>Marca de tiempo de $fecha_string <span style='color:red'>$tiempo</h1>";
 
</source>
 
</source>
*Contenido del ficheor funciones.php
+
;El código anterior imprimirá<br />
 +
[[archivo:strtotime1.png]]
 +
<br />
 +
 
 +
{{MRM_Actividad|Title=Ejemplo de uso de strtotime|
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
function a ($a, $b){
+
$dia =27;
          echo "valor de $a";
+
$mes=11;
          echo "valor de $b";
+
$year=2001;
}
+
 
?>
+
$fecha ="$mes/$dia/$year";
 +
$time = strtotime($fecha);
 +
echo "<h2>Valor de $fecha es $time</h2>h2>";
 +
<br/>
 
</source>
 
</source>
 
}}
 
}}
</div>
+
<br />
  
 
+
====strftime()====
 
+
https://www.php.net/manual/es/function.strftime.php
<div class="slide">
+
*Da formato a una fecha según el idioma establecido
===Variables dentro de una función===
+
*Para poder ver el uso de esta función , debemos establecer uno de los idiomas que tengamos instalados en el sistema.
*Dentro de una función las variables que declaremos son locales a esa función.
+
*Para realizar esta acción debemos usar la función '''''setlocale'''''
*No podré acceder a su valor fuera de la función
+
;setlocale()
*Esto también implica que dentro de una función no puedo acceder al valor de una variable definida fuera de la función
+
https://www.php.net/manual/es/function.setlocale.php
*Observa el siguiente ejemplo
+
Esta función establece un idioma para la fecha, monedas,...
<source lang=php>
+
Para poder usar esta función debemos tener instalado en el sistema ese conjunto de caracteres de formato para la localidad deseada
<?php
+
;Para ver las localidades instaladas puedes usar el comando <span class=r>locale</span>
 
+
*En caso de no tenerlo instalarlo hay que hacerlo previamente
 
+
{{MRM_Actividad|Title=Comando relacionados con instalación-configuración de locales|
function modifica_valor(){
+
;Para instalarlo
    echo "Valor de <b>var1</b> dentro de función -$var1- <br /> ";
+
<source lang=bash>
    $var1++;
+
sudo apt-get install locales
    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>
 
</source>
*Vemos que genera la siguiente salida
+
;Ver locales actualmente instalados
 
<source lang=bash>
 
<source lang=bash>
  Valor de var1 en programa principal antes de invocar función: -20-
+
  locale -a
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>
 
</source>
*Sin embargo si quieremos acceder al valor de '''''$var ''''' dentro de la función, sí que podemos
+
;Para instalar nuevos locales
*Ĥemos de usar la palabra reservada '''''$global'''''
+
<source lang=bash>
<source lang=php>
+
sudo dpkg-reconfigure locales
<?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>
 
</source>
*Ahora podemos observar cómo sí que se accede al valor dentro de la función
+
;Para instalar una localidad (locale) concreta
 
<source lang=bash>
 
<source lang=bash>
Valor de var1 en programa principal antes de invocar función: -20-
+
sudo locale-gen "en_US.utf8"
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>
 
</source>
 +
}}
 +
 +
*Saldrá un menú y seleccionaremos las localidades. Vamos a probar teniendo instalados 3 locales
 +
#es_ES.UTF-8 Español
 +
#fr_FR.UTF-8 Francés
 +
#en_US.UTF-8 Inglés
 +
Esta función retorna false o bien la localidad esablecida, si todo ha ido bien
 +
{{MRM_Actividad|Title=Probando strftime|
 +
*Mostrar el día de la semana actual en 3 idiomas: inglés, francés y castellano
 +
{{Plegable|hide|código|
 +
<source lang=php>
 +
setlocale(LC_ALL,"fr_FR.utf8");
 +
$dia = strftime("%A");
 +
echo "<h1>FranÇais $dia</h1>";
 +
setlocale(LC_ALL,"es_FR.utf8");
 +
$dia = strftime("%A");
 +
echo "<h1>Castellano $dia</h1>";
 +
setlocale(LC_ALL,"en_US.utf8");
 +
$dia = strftime("%A");
 +
echo "<h1>Inglés $dia</h1>";
 +
</source>
 +
}}
 +
}}
 +
 +
====checkdate(mes, dia, year)====
 +
*Esta función recibe tres enteros que representan  una fecha y retorna un booleano que idica si la fecha es o no correcta

Última revisión de 17:58 13 dic 2023

Volver


Funciones de fechas

  • En php hay muchas fucniones para gestionar fechas, siendo esta una tarea frecuente el las aplicaciones web.


Icon inter.gif
Referencias de funciones de fechas en php
https://www.php.net/manual/es/ref.datetime.php


  • Vamos a estudiar 5 funciones siendo dos de ellas muy utilizadas



  • En php se trabaja mucho con las fechas. Para tal cometido existe una clase llamada DateTime y DateTimeInterface (https://www.php.net/manual/es/class.datetime.php), pero muchas de sus acciones se pueden hacer de forma imperativa con funciones que vamos a ver.

time()

Obtiene una marca de tiempo 
https://www.php.net/manual/es/function.time.php
  • Esta es una función muy importante en php que conviene entender bien.
  • Me retorna el número de segundos transcurridos desde el 1 de Enero de 1970 00:00:00 GMT.

Esta fecha está relacionada con el sistema operativo UNIX que empezó a hacerse visible a partir del año 1970




  • La función time retorna un entero largo numérico


Icon activity.jpg
usar time()
  • Prueba a visualizar el retorno de la función time()
  • Mira lo que ocurre si recargas la página en ejecución, como se van actualizando los segundos



Icon qmark.gif
Pregunta
Entiendes por qué camba el valor






date()

  • La función convierte un timestamp en una fecha como cadena de caracteres con el formato que le especifiquemos
  • Para ver los metaracteres que representan el formato puedes ver la referencia web de la función

Esta función admite dos parámetros, uno de ellos es obligatoria


Icon activity.jpg
funcion date()
data("formato_fecha", "timestamp") 
parámetro 1
formato_fecha

Es un string formado por metacaracteres y caracteres literales que establece el formato en el cual queremos ver la fecha (d/m/y H:i:s), por ejemplo, donde d representa el número de día, m del mes ... y los caracteres / y : apareceran literales en la cadena

parametro 2
timestamp

Es una fecha en formato timestamp o entero largo como segundos desde una fecha Si no se establece, se toma el instante actual, es decir el resultado de la función time()





Icon activity.jpg
Ejemplo de uso de date
<?php
 
$fecha_actual =date("d/m/Y H:i:s");
echo "<h1>La fecha actual es $fecha_actual</h1>";
 
$fecha_futura =date("d/m/Y H:i:s", time()+24*60*60);
echo "<h1>La fecha de mañana será  $fecha_futura</h1>";





strtotime()

Convierte un string a fecha. https://www.php.net/manual/es/function.strtotime.php
  • Esta función admite dos parámetros, uno de ellos es obligatoria


Icon activity.jpg
funcion strtotime
strtotime("fecha_como_string", "timestamp") 
parámetro 1
fecha_como_string
Es una cadena que representa una fecha
Debemos facilitarla con el formato que entienda el sistema 
Por defecto "mes/dia/year"
parametro 2
timestamp (opcional, si no se aporta, se toma el valor que retorno time()
Es una fecha en formato timestamp o entero largo como segundos desde una fecha
Icon present.gif
Tip: Recuerda que stamptime es un entero largo que respresenta un número de segundos desde el 1 de enero de 1970





Si quisiéramos cambiar el formato, podemos usar la función data_default_timezone_set("Zona_horaria")
Descripción de la función https://www.php.net/manual/es/function.date-default-timezone-set.php
Listado agrupado de diferentes zonas horarias https://www.php.net/manual/es/timezones.php 
  • Por ejemplo
<?php
$dia= 27;
$mes = 12;
$year = 2001;
 
$fecha_string="$dia-$mes-$year";
date_default_timezone_set('Europe/Madrid');
$tiempo = strtotime($fecha_string);
echo "<h1>Marca de tiempo de $fecha_string <span style='color:red'>$tiempo</h1>";
El código anterior imprimirá

Strtotime1.png



Icon activity.jpg
Ejemplo de uso de strtotime
<?php
$dia =27;
$mes=11;
$year=2001;
 
$fecha ="$mes/$dia/$year";
$time = strtotime($fecha);
echo "<h2>Valor de $fecha es $time</h2>h2>";
<br/>




strftime()

https://www.php.net/manual/es/function.strftime.php
  • Da formato a una fecha según el idioma establecido
  • Para poder ver el uso de esta función , debemos establecer uno de los idiomas que tengamos instalados en el sistema.
  • Para realizar esta acción debemos usar la función setlocale
setlocale()
https://www.php.net/manual/es/function.setlocale.php

Esta función establece un idioma para la fecha, monedas,... Para poder usar esta función debemos tener instalado en el sistema ese conjunto de caracteres de formato para la localidad deseada

Para ver las localidades instaladas puedes usar el comando locale
  • En caso de no tenerlo instalarlo hay que hacerlo previamente


Icon activity.jpg
Comando relacionados con instalación-configuración de locales
Para instalarlo
 sudo apt-get install locales
Ver locales actualmente instalados
 locale -a
Para instalar nuevos locales
 sudo dpkg-reconfigure locales
Para instalar una localidad (locale) concreta
 sudo locale-gen "en_US.utf8"




  • Saldrá un menú y seleccionaremos las localidades. Vamos a probar teniendo instalados 3 locales
  1. es_ES.UTF-8 Español
  2. fr_FR.UTF-8 Francés
  3. en_US.UTF-8 Inglés

Esta función retorna false o bien la localidad esablecida, si todo ha ido bien


Icon activity.jpg
Probando strftime
  • Mostrar el día de la semana actual en 3 idiomas: inglés, francés y castellano




checkdate(mes, dia, year)

  • Esta función recibe tres enteros que representan una fecha y retorna un booleano que idica si la fecha es o no correcta