TypeError en PHP 7

PHP 7 presentó los parámetros de tipo de función y los tipos de retorno de función. Esto, a su vez, implicaba la necesidad de manejar adecuadamente los errores relacionados con su mal uso. TypeError se introdujo para atacar estos errores.
La clase TypeError no tiene métodos propios, todos se heredan de la clase Error principal, según la siguiente sinopsis de la clase:

ParseError extends Error {
final public string Error::getMessage (void)
final public Throwable Error::getPrevious (void)
final public mixed Error::getCode (void)
final public string Error::getFile (void)
final public int Error::getLine (void)
final public array Error::getTrace (void)
final public string Error::getTraceAsString (void)
public string Error::__toString (void)
final private void Error::__clone (void)
}

Hay al menos tres posibles escenarios de error que arrojan TypeError, que son los siguientes:

  • El tipo de argumento pasado a una función no coincide con el tipo declarado
  • El valor de retorno de la función no coincide con el tipo de retorno de la función declarada
  • Se pasa un número no válido de argumentos a una función PHP incorporada

El siguiente código muestra el tipo de argumento de función incorrecto:

<?php
declare(strict_types = 1);
function hello(string $name) {
return "Hello $name!";
}
try {
echo hello(34);
}
catch (TypeError $e) {
echo 'Caught: ' . $e->getMessage();
}

Aquí, definimos la función hello() que espera recibir un único argumento de cadena.
Sin embargo, a la función se le pasa al valor entero. El declare(strictly_types = 1); la expresión es necesaria si queremos que el bloque catch realmente capture TypeError.
El ejemplo anterior da como resultado el siguiente resultado:

Caught: Argument 1 passed to hello() must be of the type string, integer given, called in…

El siguiente código muestra el tipo de retorno de función incorrecto:

<?php
declare(strict_types = 1);
function hello($name): string {
return strlen($name);
}
try {
echo hello('branko');
}
catch (TypeError $e) {
echo 'Caught: ' . $e->getMessage();
}

Aquí, la función hello() definida no tiene tipos de argumentos específicos definidos, pero sí tiene un tipo de retorno de función definido. Para simular el escenario defectuoso, cambiamos el cuerpo de la función para devolver el valor entero en lugar de la cadena. Igual que con el anterior ejemplo, la declaración strictly_types = 1 era necesaria para desencadenar TypeError, lo que resultó en la siguiente salida:

Caught: Return value of hello() must be of the type string, integer returned

El siguiente código muestra la cantidad no válida de argumentos que se pasan a una función PHP integrada:

<?php
declare(strict_types = 1);
try {
echo strlen('test', 'extra');
}
catch (TypeError $e) {
echo 'Caught: ' . $e->getMessage();
}

Aquí, estamos llamando a la función strlen() con dos parámetros. Aunque esta función básica de PHP en sí misma está definida de tal manera que solo acepta un parámetro, la declaración strictly_types = 1 convierte la advertencia estándar en TypeError, lo que activa el bloque catch.

Comparte