Todos sabemos que en PHP se pueden hacer auténticas barbaridades debido, entre otras cosas, a tu tipado débil. El tipado débil es una fuente de muchos problemas si no se es suficientemente disciplinado. Y en el mundo de desarrollo la disciplina no siempre se deja ver todo lo a menudo que debería.
Por eso es una buena práctica obligarnos a ser muy estrictos en PHP.
Para ello hay dos líneas de código que deberían estar siempre presentes en tus aplicaciones o scripts:
<?php
declare(strict_types=1);
error_reporting( E_ALL );
Por fortuna las últimas versiones de PHP ya vienen con estas dos opciones activadas por defecto (lo que ha supuesto muchos quebraderos de cabeza a mucha gente al actualizar sus aplicaciones).
Así que, por favor, no hagas esto:
<?php
declare(strict_types=0);
error_reporting( ~E_NOTICE );
Ahora es cuando alguien encuentra este post y dice «así que así es como se desactiva el modo estricto, voy a quitarlo»… ¡nooooo!
declare(strict_types=1);
Esta opción obliga a que se tengan que respetar los tipos de argumentos en una función. Así, este código daría un error:
function nombreCompleto(string $nombre, string $apellidos)
{
return $apellidos . ", " . $nombre;
}
echo nombreCompleto("Gorka", "Urrutia") . "\n";
echo nombreCompleto("Gorka", 0) . "\n";
Te preguntarás ¿y por qué alguien iba a querer pasar un 0 en lugar de un string? ¡Pues pasa mucho! No sería la primera vez que lo veo, ni la segunda, ni…
Y la solución aquí no es:
declare(strict_types=0);
¡Ni se te ocurra!
Por supuesto esto aplica también a los tipos de dato devueltos por una función:
function nombreCompleto(string $nombre, string $apellidos) : string
{
return 1;
}
Esto no se puede hacer. Pero ¡adivina! ¡con strict_types=0 sí se puede!
Ojo cuando un parámetro es un entero. En este ejemplo esto sí daría error porque estamos pasando un número flotante:
function numero(int $numero)
{
}
numero(10.0);
error_reporting( E_ALL );
Este es un ya viejo conocido y debería estar en todos los proyectos. Olvídate de aberraciones como:
error_reporting( ~E_NOTICE );
Esto te permite salirte de los límites de un array y cosas como ésta funcionarían:
$array = [];
echo $array[1];
Pero ¿a que tú no eres de esas personas que hacen estas cosas?
1 comentario en «Seamos estrictos en PHP (declare_strict=1 y otras zarandajas)»