Tipos de retorno nullables en PHP7


PHP 7 introduce declaraciones de tipo de retorno. Lo que significa que ahora puedo indicar que el valor devuelto es una cierta clase, interfaz, matriz, llamable o uno de los tipos escalares recién insinuables, como es posible para los parámetros de función.

function returnHello(): string {
    return 'hello';
}

A menudo sucede que un valor no siempre está presente, y que puede devolver algo de algún tipo, o null. Si bien puede hacer que los parámetros sean nullables estableciendo su valor predeterminado en null (DateTime $time = null), no parece haber una forma de hacerlo esto para los tipos de retorno. ¿Es ese el caso, o de alguna manera no estoy encontrando cómo hacerlo? Estos no funcionan:

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}
Author: Jeroen De Dauw, 2015-11-09

2 answers

PHP 7.1 ahora soporta tipos de retorno nullables. El primer RFC al que enlacé es el que buscaron:

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

Antigua respuesta:

Dado que mi comentario fue en realidad una respuesta a la pregunta:

PHP 7 no soportará tipos de retorno nullables por el momento, pero hay un RFC para abordar precisamente eso, su objetivo es aterrizar en PHP 7.1. Si pasa, la sintaxis afectaría a todas las sugerencias de tipo (tanto los tipos de retorno como las sugerencias de tipo):

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

También Hay un compitiendo RFC para agregar tipos de unión, que serían capaces de hacer lo mismo, pero se verían diferentes:

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

Por ahora, sin embargo, tendrás que escribir:

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

O simplemente devuelve una cadena vacía para ser consistente con el tipo devuelto, y marca falsy value:

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}
 162
Author: Elias Van Ootegem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-26 22:43:35

Los tipos nullables están disponibles en PHP 7.1.

Este es un ejemplo de sintaxis:

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1 ahora es GA y puede actualizar desde PHP 7.0 (solo hay unos pocos cambios incompatibles hacia atrás que debe verificar)

 45
Author: the_nuts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-02 07:44:39