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?
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.
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.
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!
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.
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
.
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