Otro cambio importante en PHP 8 es la implementación de un manejo más coherente de errores en las funciones y métodos internos del lenguaje. Reduciendo la inconsistencia presente en versiones anteriores de PHP, en las que algunas veces se emitían advertencias, y otras veces se arrojaban excepciones. También se añaden otros cambios útiles para depuración. A continuación repasaremos los cambios más importantes:

Comparación de manejo de errores en funciones y métodos internos entre PHP 7 y PHP 8

Comportamiento previo

Históricamente, PHP no implementaba un estándar único para el manejo de errores en funciones internas del lenguaje, esto nos obliga a considerar las diferentes maneras en las que cada función o método devuelve advertencias, errores o excepciones por caso individual.

Esta misma inconsistencia aumenta la probabilidad de que cometamos errores de programación, con tantas pequeñas diferencias de manejo de errores entre cientos de funciones y métodos, fácilmente podríamos hacer asunciones erróneas acerca del comportamiento de alguna función del lenguaje de manera inadvertida, creando fallas y dificultando el proceso de depuración y corrección de dichas fallas para los desarrolladores.

Es necesario que prestemos especial atención a las funciones de PHP que solo arrojan una advertencia sin detener la ejecución del código o arrojar errores. Es buena práctica implementar validación adicional al utilizar este tipo de funciones o métodos.

Es por esto que partir de PHP 8, se comenzará a corregir esta inconsistencia cambiando el comportamiento de múltiples funciones internas para que se adhiera al nuevo estandar de manejo de errores, aunque esta versión no incluye un cambio al 100%, se espera que éste se complete gradualmente en futuras versiones del lenguaje.

Comportamiento actual

Ahora la mayoría de las funciones internas de PHP implementan comprobación de tipo, en lugar de advertencias, ahora PHP lanza excepciones en errores de tipo TypeError y de valor ValueError. Esto nos permite manejar errores de manera mucho más robusta.

Ejemplos

PHP 7

<?php
  strlen([]);
  // Advertencia: strlen() espera que el parámetro 1 sea string, pero el parámetro es de tipo array
  // Devuelve NULL

PHP 8

<?php
  strlen([]);
  // TypeError: strlen(): El argumento #1 ($str) debe ser de tipo string, pero es de tipo array
  // Arroja error de tipo

El comportamiento previo de PHP se consideraba indeseado, ya que algunas funciones emitían advertencias de PHP en lugar de errores. Las advertencias no detienen la ejecución del código, lo cual puede generar comportamientos inesperados en nuestras aplicaciones.

Otros cambios

Arrojando excepciones dentro de expresiones

Ahora está permitido utilizar la palabra clave throw para arrojar excepciones dentro de expresiones ternarias.

$foo = isset($var) ? $var : throw new \InvalidArgumentException('Valor no declarado');

Atrapando excepciones por tipo

A partir de PHP 8 es posible utilizar catch pasando solo el tipo de la excepción sin necesidad de capturar el objeto de excepción completo.

try
{
  // Bloque de código
}
catch(TypeError)
{
  // no atrapa el objeto $exception, en su lugar devuelve el error de tipo
}

El operador de supresión de errores @

El operador de supresión de errores @ silenciaba errores fatales, que generan fallo del script, este comportamiento fue corregido en esta versión. Ahora  @ no ocultará errores fatales por defecto.

@ no previene errores, solamente oculta los mensajes de error generados por el código.

Reporte de errores por defecto cambiado a E_ALL

PHP estaba configurado para ocultar tanto advertencias estrictas como advertencias de deprecación en versiones anteriores del lenguaje. La nueva configuración por defecto cambia esto y se muestran todos los niveles de errores o advertencias.

Puedes cambiar el nivel de errores desde el archivo php.ini o utilizando la función error_reporting().

Los errores de inicialización de PHP ahora se muestran por defecto

Por defecto, PHP mostrará cualquier error de inicialización que se genere desde el inicio (configuraciones INI no válidas, fallas de carga de extensiones dinámicas, etc…).

Retrocompatibilidad

Este cambio no es compatible con versiones previas de PHP. Dado que este cambio impacta la lógica de validación de PHP. Deberás modificar tu código de manera acorde para evitar fallas si decides actualizar tu aplicación desde una versión anterior a PHP 8.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Atributos en PHP 8 Lección siguiente Novedades de PHP 8.1