Void como tipo de retorno


Estaba probando tipos de retorno con PHP 7.

He creado un script simple para probar los tipos de retorno de PHP 7:

<?php

Class Obj {

    public function __construct(){

    }

    public function test(): string { //a string needs to be returned
        return "ok";
    }

}

function foo(): Obj { //instance of Obj needs to be returned
    return new Obj();
}

$o = foo();
echo $o->test(); // output: ok

Ahora en otros lenguajes de programación cuando especifica un tipo de retorno void significa que no puede devolver nada o obtendrá un error. Así que escribí este guión:

<?php

    function foo(): void {

    }

    foo(); 

Ahora en el script anterior la salida esperada no es nada. En cambio, me da un error fatal:

Error fatal: El valor devuelto de foo () debe ser una instancia de void, none returned en la línea 2

Mi pregunta es (no pude encontrarla), ¿en PHP 7 habrá un tipo void similar?

Author: Rizier123, 2015-04-22

5 answers

Editar:

Un nuevo RFC separado para un tipo de retorno nulo ha sido publicado, ha pasado la votación, y se implementó en PHP 7.1.
Ahora hay un tipo de retorno void en PHP. :)

Mensaje original:

Tomado de wiki.php.net:

Labor futura

Las ideas para el trabajo futuro que están fuera del alcance de esta RFC incluyen:

  • Permitir que las funciones declaren que no devuelven nada en absoluto (void en Java y C)

Así que actualmente no hay forma de declarar que no devuelves nada.
No se que es lo mejor en tu situación, pero probablemente iría con no declarar el tipo de devolución por ahora.

Para responder a su pregunta si habrá un tipo de retorno void en PHP 7:
Todavía no hay una garantía , pero creo que es muy probable que void o un sinónimo se implemente de alguna manera.

 49
Author: Siguza,
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-08-17 12:41:53

Autor de los tipos de retorno RFC aquí. En PHP 7.0 no habrá void tipos de retorno ya que el RFC no lo agregó y tampoco ningún otro RFC dirigido a PHP 7.0.

El tipo void puede existir en la serie PHP 7 si decidimos que agregar nuevas palabras clave/reservadas está bien para versiones menores aunque rompan el código. Esto es algo incierto, pero se hizo en PHP 5.4 con la palabra clave callable.


Personalmente, no creo que necesitemos void; ya have null. Del manual :

El valor NULL especial representa una variable sin valor. NULL es el único valor posible de tipo null.

En PHP una función que no devuelve nada devolverá implícitamente null. Esto significa que nunca realmente no puedes devolver nada*. Ir a la ruta null significa que no hay interrupciones de compatibilidad hacia atrás desde null no será un nombre de clase/interfaz/rasgo válido que comience en PHP 7.0 y no añade ninguna nueva clave o palabras reservadas.

*Las personas familiarizadas con el motor Zend se darán cuenta de que no puede devolver nada, pero si no devuelve nada, la variable que está asignando se asignará null, lo que los hace lógicamente equivalentes.


En PHP 7.1 habrá un pseudo-tipo void. Se define en el tipo de retorno de vacío RFC.

Personalmente estoy triste por esto porque el autor de RFC había "renunciado" previamente y recogí el RFC. Entonces lo siguiente que sé es propuesto y en discusión y ella no esperaría a que yo propusiera tipos de unión, que habría sido la contraparte a void como se señaló anteriormente. Oh, bueno.

 15
Author: Levi Morrison,
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-02-01 15:32:21

El tipo de retorno void fue aceptado para php 7.1. Así que vendrá en el futuro.

Algunos ejemplos sobre cómo funcionará:

function should_return_nothing(): void {
    return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
    return null; // Fatal error: A void function must not return a value
}
function lacks_return(): void {
    // valid
}
function returns_nothing(): void {
    return; // valid
}

Ver el RFC de Andrea Faulds para más información!

 11
Author: acrobat,
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
2015-11-12 12:28:23

No hay un tipo equivalente para void en php, return NULL; puede ajustarse a su requisito ya que no tiene ningún tipo como 0 o cualquier otro valor. Nota: vacío real significa no retorno.

 1
Author: Sanjay Kumar N S,
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
2015-04-22 09:17:20

@BeNice Entiendo su punto, de todos modos resumo la consideración de Levi Morrison como una cuestión práctica de la sostenibilidad: introduciendo void como un posible tipo de retorno de hecho, rompemos la suposición de que el único tipo posible de null es null.

De esta manera, void debe devolverse para la comprobación de tipo de null, cambiando las restricciones de la arquitectura por diseño y causando un desorden en la compatibilidad con versiones anteriores.

// your choice implies this comparison should be true:
gettype(null) === void;

Creo que quien usó null no con frecuencia en su código tendría la implementación de tipo void.

 0
Author: Emanuele Del Grande,
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
2018-03-24 01:43:30