PHP declare
En PHP declare es un constructor, y su uso difiere mucho de las estructuras de control que estamos acostumbrados. Este constructor es utilizado para establecer directivas de ejecución para un bloque de código.
¿Pero qué queremos decir con esto?
Si has leído el artículo de CSP en PHP, puede que te des una idea de como funciona este constructor.
Pero vamos a que es una directiva en nuestra lengua
Una directiva es una instrucción o directriz que se da a alguien para que siga un curso de acción específico, en pocas palabras estamos diciéndole a nuestro bloque algo que debe de hacer cuando se ejecuta.
Directivas utilizables en declare
En el constructor declare
tenemos 3 directivas utilizables, ticks
, strict_type
y encoding
ticks
https://blastcoding.com/php-declare/#ticksEsta directiva permite ejecutar una función específica después de un número determinado de sentencias de bajo nivel.
Los eventos que ocurren en cada tick se especifican mediante la función register_tick_function()
register_tick_function(callable $function, mixed $arg = ?, mixed $... = ?): bool
register_tick_function("miFuncion");// es una sentencia function miFuncion() { echo "Se ha ejecutado la función miFuncion \n"; }; declare(ticks=2){ for ($i = 0; $i < 5;$i++) { echo "Iteración $i \n";// es una sentencia echo "Iteración2 $i \n";// es una sentencia } }
Iteración 0 Iteración2 0 Se ha ejecutado la función miFuncion Iteración 1 Iteración2 1 Se ha ejecutado la función miFuncion Iteración 2 Iteración2 2 Se ha ejecutado la función miFuncion Iteración 3 Iteración2 3 Se ha ejecutado la función miFuncion Iteración 4 Iteración2 4 Se ha ejecutado la función miFuncion
Para entender los ticks puedes verlo como si fuera un reloj cada segundo genera un tick, solo que aqui cada sentencia basica tickable genera un tick.
Entendiendo los ticksregister_tick_function("miFuncion"); function miFuncion() { echo "Se ha ejecutado la función miFuncion \n"; }; declare(ticks=1){ for ($i = 0; $i < 2;$i++) { echo "Iteración $i \n"; echo "Iteración2 $i \n"; } }
Iteración 0 Se ha ejecutado la función miFuncion Iteración2 0 Se ha ejecutado la función miFuncion Iteración 1 Se ha ejecutado la función miFuncion Iteración2 1 Se ha ejecutado la función miFuncion Se ha ejecutado la función miFuncion
En este ejemplo puedes ver que en su resultado vemos un último "Se ha ejecutado la función miFuncion"
de más, esto se debe a que register_tick_function("miFuncion");
está generando este último tick y esto lo está haciendo fuera de nuestro loop
strict_types
https://blastcoding.com/php-declare/#strict_typesstrict_type
solo puede tener dos valores:
0
: Deshabilita el tipado estricto. Este es el comportamiento predeterminado de PHP.1
: Habilita el tipado estricto.
¿Qué es el tipado estricto?
Esto significa que el tipo de dato de cada variable y expresión debe ser compatible con el contexto en el que se usa. ¿Creo que esto ya lo habíamos visto en funciones en PHP?
En caso de usar Strict type
Con declare(strict_type=1)<?php declare(strict_types=1); function holamundo(string $a, string $b){ echo $a." ".$b; } holamundo(1,"mundo");
Fatal error: Uncaught TypeError: holamundo(): Argument #1 ($a) must be of type string, int given, called in C:\xampp\htdocs\tutorialphp\funciones.php on line 6 and defined in C:\xampp\htdocs\tutorialphp\funciones.php:3 Stack trace: #0 C:\xampp\htdocs\tutorialphp\funciones.php(6): holamundo(1, 'mundo') #1 {main} thrown in C:\xampp\htdocs\tutorialphp\funciones.php on line 3
vea que si o si $a debe ser un string y por tanto nos da un TypeError, ya que holamundo esta recibiendo un parámetro que es un entero
Encoding
https://blastcoding.com/php-declare/#encodingCon declare también puedes especificar la codificación que quieres que se use en el script.
<?php declare(encoding='ISO-8859-1'); // código aquí ?>
UTF-8: Codificación Unicode por defecto en PHP, compatible con la mayoría de caracteres del mundo.
ISO-8859-1: Codificación de caracteres de 8 bits para idiomas de Europa occidental.
ASCII: Subconjunto de ISO-8859-1 compatible con caracteres ingleses básicos.
UTF-16: Codificación Unicode que usa 16 bits por caracter.
UTF-32: Codificación Unicode que usa 32 bits por caracter.
Windows-1252: Codificación de caracteres de 8 bits para idiomas de Europa occidental y Central.
ISO-2022-JP: Codificación de caracteres de 8 bits para japonés.
EUC-JP: Codificación de caracteres de varios bytes para japonés.
GB2312: Codificación de caracteres de varios bytes para chino simplificado.
Big5: Codificación de caracteres de varios bytes para chino tradicional.