Tipos anulables en PHP 7

Muchos lenguajes de programación permiten algún tipo de tipos opcionales o anulables, dependiendo de la terminología. El tipo dinámico de PHP ya admite esta noción a través del tipo nulo incorporado.
Se considera que una variable es del tipo nulo si se le ha asignado un valor constante nulo, no se le ha asignado ningún valor o se ha desarmado usando la construcción unset(). Aparte de las variables, el tipo nulo también se puede usar como parámetro de la función, asignando un valor predeterminado de nulo.

Sin embargo, esto impuso una cierta limitación, ya que no podríamos declarar un parámetro que podría ser nulo sin marcarlo como opcional al mismo tiempo.
PHP 7.1 abordó esta limitación al agregar un símbolo de signo de interrogación (?) Para indicar que un tipo puede ser nulo, a menos que se asigne específicamente a algún otro valor. Esto también significa que el tipo podría ser nulo y obligatorio en el mismo tipo. Estos tipos anulables ahora son permitidos casi en cualquier lugar donde se permiten declaraciones de tipo.

El siguiente es un ejemplo del tipo anulable con un valor de parámetro obligatorio:

function welcome(?string $name) {
echo $name;
}
welcome(); // invalid
welcome(null); // valid

La primera llamada a la función de welcome arroja un \Error, porque su declaración hace que el parámetro sea obligatorio. Dice que el tipo anulable no debe confundirse con nulo que se pasa como un valor.
El siguiente es un ejemplo de un tipo anulable con un valor de parámetro opcional, opcional en el sentido de que ya se le ha asignado un valor predeterminado de nulo:

function goodbye(?string $name = null)
{
if (is_null($name))
{
echo 'Goodbye!';
}
else
{
echo "Goodbye $name!";
}
}
goodbye(); // valid
goodbye(null); // valid
goodbye('John'); // valid

El siguiente es un ejemplo de declaración de función que utiliza el tipo de retorno anulable:

function welcome($name): ?string
{
return null; // valid
}
function welcome($name): ?string
{
return 'Welcome ' . $name; // valid
}
function welcome($name): ?string
{
return 33; // invalid
}

Los tipos anulables funcionan tanto con tipos escalares (Boolean, Integer, Float, String) como con tipos compuestos (Array, Object, Callable).

Comparte