PHP 8.1 introduce el tipo de never retorno, ¿qué es? y cual es la diferencia entre never y void ?
declaración de tipo never introducida para ser utilizada como sugerencia de tipo de retorno para funciones que nunca tienen declaración de return ni implícita ni explícita. Y debe terminar lanzando una excepción o saliendo usando las funciones exit/die .
function redirect(string $uri): never { header('Location: ' . $uri); exit(); } Aquí la redirect se llama una función que nunca regresa, porque:
1) No tiene declaración de return definida explícitamente.
function redirect(string $uri): never { exit(); return 'something'; }Producirá:
Error fatal de PHP: una función que nunca regresa no debe regresar
2) No tiene declaración de return definida implícitamente.
function redirect(string $uri): never { if (false) { header('Location: ' . $uri); exit(); } } Dado que la condición aquí nunca se cumple, la ejecución salta sobre la instrucción if que devuelve un NULL implícito que dará como resultado:
Error fatal de PHP: TypeError no detectado: redirigir (): la función que nunca regresa no debe devolver implícitamente
3) Termina su ejecución con una función de exit
void puede tener return; pero never no se puede.never hace cumplir que una función lanza o termina con exit/die pero void no.never es un subtipo de cualquier otro tipo en el sistema de tipos de PHP, incluido void (esto permite la covarianza de tipos de retorno).void sobre never y viceversa? Debe declarar un tipo de retorno de función void cuando espera que PHP ejecute la siguiente declaración después de la llamada a la función. Y never debe declararlo cuando no espera que PHP ejecute la siguiente declaración después de esa llamada de función.
Con never (PHP 8.1) puede salvaguardar una función para que nunca regrese, por ejemplo, si desea asegurarse de que un bucle sin fin creado sea realmente sin fin (desde la perspectiva del sitio de la llamada):
<?php function eternity(string $forEternity): never { start: usleep(1000); goto start; } eternity('the future'); // <- we are here only after the next big-bang, not in this current universe.Este código es súper simplificado, normalmente olvidar la instrucción goto aquí desencadenaría el error.
Los bucles interminables normalmente tampoco son necesarios para protegerse (ya que normalmente nunca queremos que sucedan), pero never es útil para que una función die() , exit() o throw una Excepción, siempre.
Nuevamente, aunque estas tres formas de salir de una función no se recomiendan en el flujo de control estándar (las dos primeras incluso controlan el proceso en ejecución en algunos SAPI). Pero finalmente (sin juego de palabras), es posible que el IDE y las herramientas vean que una función nunca regresa directamente desde la información de tipo de retorno codificada en el código. Esto también incluye a los humanos que usan dichas herramientas o que leen el código.
Con void (PHP 7.1) garantiza que una función nunca devuelva un tipo, incluido el tipo inferior never (ya que solo puede usar void o never ).
<?php function back_from_eternity(string $forEternity): void { usleep(100000); // not so long return $forEternity } $echo = back_from_eternity('soon'); Permite que PHP evite que el eco regrese desde la eternidad, así como que el lector detecte que $echo = (y lo que se haga después con esa variable) aún necesita el mantenimiento/depuración/prueba o desarrollo habituales.
Ambos tienen el beneficio de que arrojan cuando se violan, por lo que el programa nunca continuará como está y anulará la devolución de la llamada a la función (todos los juegos de palabras son intencionados).
Aún se deben considerar los efectos secundarios de llamar a la función. Normalmente se trata de ellos.