Desde la versión 7 de PHP tenemos disponible la directiva strict_types. Esto nos permite declarar el modo estricto para tipos escalares en un archivo de PHP. No en toda la aplicación, tema o plugin… únicamente en el archivo donde se declare.
Declarar strict types en nuestros ficheros PHP, forzará a que nuestros métodos acepten variables únicamente del tipo exacto que se declaren. En caso contrario lanzará un TypeError.
Esto nos permitirá que nuestro desarrollo sea más robusto, y que nuestros métodos no se traguen cualquier cosa. También se puede aplicar para el retorno, es decir, si un método tiene que devolver una cadena, se forzará a que siempre sea así… si sucede algo entre medias y devuelve un entero o un array… obtendremos un TypeError.
Si obtenemos un TypeError querrá decir que nuestro método en algún punto ha hecho algo que no teníamos contemplado, y está devolviendo un valor que no queremos, o está recibiendo algún argumento de un tipo diferente al que esperamos.
Lo «malo» de todo esto, es que si queremos que nuestra aplicación sea estricta y robusta, tendremos que declarar el modo estricto en todos los archivos PHP de nuestro desarrollo.
Importante, la declaración de strict_types debe hacerse en la primera línea, nada más abrir PHP:
<?php declare( strict_types = 1 );
echo 'Hola, mundo!';
Y los tipos que podemos declarar son los siguientes:
array | |
function foo(array $bar) | PHP 5.1+ |
function foo(array $bar = null) | PHP 5.1+ |
function foo(): array | PHP 7.0+ |
function foo(): ?array | PHP 7.1+ |
bool | |
function foo(bool $bar) | PHP 7.0+ |
function foo(bool $bar = null) | PHP 7.0+ |
function foo(): bool | PHP 7.0+ |
function foo(): ?bool | PHP 7.1+ |
callable | |
function foo(callable $bar) | PHP 5.4+ |
function foo(callable $bar = null) | PHP 5.4+ |
function foo(): callable | PHP 7.0+ |
function foo(): ?callable | PHP 7.1+ |
float | |
function foo(float $bar) | PHP 7.0+ |
function foo(float $bar = null) | PHP 7.0+ |
function foo(): float | PHP 7.0+ |
function foo(): ?float | PHP 7.1+ |
int | |
function foo(int $bar) | PHP 7.0+ |
function foo(int $bar = null) | PHP 7.0+ |
function foo(): int | PHP 7.0+ |
function foo(): ?int | PHP 7.1+ |
iterable | |
function foo(iterable $bar) | PHP 7.1+ |
function foo(iterable $bar = null) | PHP 7.1+ |
function foo(): iterable | PHP 7.1+ |
function foo(): ?iterable | PHP 7.1+ |
object | |
function foo(object $bar) | PHP 7.2+ |
function foo(object $bar = null) | PHP 7.2+ |
function foo(): object | PHP 7.2+ |
function foo(): ?object | PHP 7.2+ |
self | |
function foo(self $bar) | PHP 5.0+ |
function foo(self $bar = null) | PHP 5.1+ |
function foo(): self | PHP 7.0+ |
function foo(): ?self | PHP 7.1+ |
string | |
function foo(string $bar) | PHP 7.0+ |
function foo(string $bar = null) | PHP 7.0+ |
function foo(): string | PHP 7.0+ |
function foo(): ?string | PHP 7.1+ |
class names | |
function foo(ClassName $bar) | PHP 5.0+ |
function foo(ClassName $bar = null) | PHP 5.1+ |
function foo(): ClassName | PHP 7.0+ |
function foo(): ?ClassName | PHP 7.1+ |
void | |
function foo(): void | PHP 7.1+ |
Al declarar strict_types, las propias funciones de PHP también se rigen por el modo estricto, por lo tanto generarán TypeError si no reciben los parámetros tal y cómo los esperan, en lugar de emitir un warning.
Pues ya no tienes excusa para crear tus desarrollos de una manera más robusta y fiable 😉