Seamos estrictos en PHP (declare_strict=1 y otras zarandajas)

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?

Me siento solo, dime algo...