PHP 8.3: Novedades y cambios de la última versión

Captura de pantalla del código PHP 8.3 y nuevas características.
Tiempo de lectura: 8 minutos

Índice

PHP 8.3, publicada el 23 de noviembre, introduce importantes novedades y mejoras respecto a su versión anterior, PHP 8.2. Esta versión, aunque considerada 'menor', trae consigo cambios significativos que pueden tener un gran impacto en el desarrollo de PHP. Echemos un vistazo a las principales novedades y actualizaciones de PHP 8.3.

Nuevas funciones y mejoras en PHP 8.3 PHP 8.3 introdujo varias nuevas características y mejoras:

Constantes de Clase Tipificadas en PHP 8.3: Una Revolución en la Programación

PHP 8.3 introduce una característica revolucionaria: la tipificación de constantes de clase. Aunque PHP ya había introducido la tipificación de propiedades de clase en PHP 7.4, esta innovación aún no se había extendido a las constantes. Hasta ahora.

La nueva versión amplía la tipificación a las constantes de clase, incluidas las de interfaces, traits y enums. Este cambio tiene la importante ventaja de minimizar el riesgo de que los desarrolladores se desvíen de la intención original de una constante, lo que garantiza una mayor claridad y seguridad en el código.

Para ilustrarlo, he aquí un ejemplo práctico:

// Correcto:
interfaz ConstTest {
const string VERSION = "PHP 8.3"; // Tipo y valor son ambos cadenas
}

// Incorrecto:
interfaz ConstTest {
const float VERSION = "PHP 8.3"; // Error de tipo y valor
}

La efectividad de las constantes de clase tipadas se hace evidente cuando se trabaja con clases derivadas. En versiones anteriores, una subclase podía cambiar el valor de una constante, pero con PHP 8.3, ahora es posible prevenir cambios accidentales al tipo de una constante mientras se preserva la consistencia con la declaración original.

Por ejemplo:

clase ConstTest {
const string VERSIÓN = 'PHP 8.2';
}

class MyConstTest extends ConstTest {
// Correcto: se permite cambiar el valor de VERSION
const string VERSIÓN = 'PHP 8.3';

// Incorrecto: el tipo debe declararse como en la clase base
const VERSION = 'PHP 8.3';

// Incorrecto: no es posible cambiar el tipo declarado en la clase base
const float VERSION = 8.3;
}

Tenga en cuenta que es posible "restringir" el tipo de una constante de clase en una subclase, utilizando un tipo compatible o más específico:

clase ConstTest {
const string|float VERSION = 'PHP 8.2';
}

class MyConstTest extends ConstTest {
// Correcto: es posible especificar el tipo como string o float
const string VERSIÓN = 'PHP 8.3';
const float VERSION = 8.3;

// Correcto: aunque el valor podría ser un int, es compatible con float
const float VERSION = 8;

// Incorrecto: no es posible ampliar las opciones de tipo incluyendo int
const string|float|int VERSIÓN = 8;
}

Sin embargo, es importante señalar que existen dos tipos, void e nuncaampliamente utilizado para las propiedades y

no están soportados actualmente como tipos para constantes de clase en PHP 8.3.

En resumen, la tipificación constante de clases en PHP 8.3 representa un salto cualitativo en el desarrollo de software. Proporciona a los programadores una herramienta adicional para asegurar que el código no sólo es funcional, sino también preciso y fiel a las intenciones originales, reduciendo errores y mejorando la legibilidad y mantenibilidad del código. Esta innovación marca una nueva evolución de la tipificación en PHP, consolidando su posición como lenguaje de programación moderno y robusto.

Nueva función en PHP 8.3: json_validate()

La manipulación de datos codificados en JSON es una práctica habitual en desarrollo web. En PHP 8.3, una nueva función , json_validate()se introdujo para mejorar significativamente este proceso. Esta función es especialmente útil para comprobar la validez sintáctica de una carga útil JSON antes de proceder a su uso.

En versiones anteriores de PHP, los desarrolladores confiaban en la función json_decode() para comprobar si había errores al convertir datos JSON en matrices asociativas u objetos. Sin embargo, este método requería el uso de importantes recursos para construir las estructuras de matrices u objetos, incluso cuando el único propósito era comprobar la integridad del JSON.

He aquí un ejemplo json_decode() para validar una carga útil JSON:

$obj = json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
// Ejecución de operaciones con $obj
}

En este escenario, los recursos se utilizaban principalmente para establecer la validez de la carga útil JSON, lo que no era muy eficiente en términos de uso de memoria.

Con la llegada de PHP 8.3, es posible realizar la misma operación de forma más eficiente utilizando json_validate():

if (json_validate($maybeJSON)) {
// Ejecución de operaciones con $maybeJSON
}

Importante: Hay que recordar que no es óptimo utilizar json_validate() y luego pasar los datos a través de json_decode()ya que esto seguiría consumiendo recursos de memoria para la descodificación. Lo ideal es utilizar json_validate() para confirmar la validez del JSON antes de proceder a otras operaciones, como guardar los datos o transmitirlos como respuesta a una solicitud. Esto optimiza el uso de recursos y garantiza un procesamiento más eficiente de los datos JSON.

Clonación Profunda de Propiedades de Solo Lectura en PHP 8.3

PHP 8.3 introdujo una mejora significativa en la gestión de propiedades de sólo lectura en las clases. Esta funcionalidad, inicialmente introducida en PHP 8.1 para propiedades individuales y luego extendida a clases enteras en PHP 8.2, recibió un mayor desarrollo gracias a un reciente RFC (Request For Comments).

El problema abordado era la inflexibilidad de utilizar clases con propiedades de sólo lectura, lo que limitaba ciertas posibilidades de programación. La RFC proponía dos soluciones principales:

  1. Permitir la ampliación de clases no legibles a partir de clases legibles.
  2. Permitir la reinicialización de propiedades de sólo lectura durante la clonación.

La segunda propuesta, adoptada en PHP 8.3, supuso un gran avance en la gestión de propiedades de sólo lectura. Esta nueva funcionalidad permite que, durante la clonación profunda, las instancias de una clase con propiedades de sólo lectura puedan reiniciarse dentro de la clase método mágico __clone. Esto significa que las funciones invocadas por __clone puede modificar legalmente estas propiedades.

He aquí un ejemplo práctico de la RFC que ilustra el nuevo comportamiento:

clase Foo {
función pública __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}

public function __clone() {
// Durante la clonación, $bar recibirá un nuevo objeto DateTime
$this->bar = clon $this->bar;

// Esta función será llamada
$this->cloneBaz();
}

private function cloneBaz() {
// Esta operación es legal cuando se llama dentro de __clone
unset($this->baz);
}
}

$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clon $foo;

Esta nueva característica aumenta significativamente la flexibilidad de uso de clases con propiedades de sólo lectura, permitiendo utilizar patrones de diseño más avanzados y sofisticados, manteniendo la integridad y seguridad que ofrecen las propiedades de sólo lectura.

Introducción al Nuevo Atributo #[\Override] en PHP 8.3

PHP 8.3 introdujo una nueva e importante característica que mejora significativamente la claridad y precisión del código: la función #[\Override]. Este nuevo atributo es crucial cuando se trabaja con herencia e interfaces en PHP, ya que proporciona una confirmación explícita de que un método en una clase hija está destinado a anular un método en la clase padre o a implementar un método definido en una interfaz.

Problema resuelto por #[\\N-override]: En programación, puede ocurrir que un método de una clase derivada se escriba con la intención de sobrescribir un método de la clase padre o de implementar un método de una interfaz. Sin embargo, errores como errores tipográficos en el nombre del método pueden hacer que el método no sobrescriba realmente el método previsto, lo que lleva a un comportamiento inesperado que es difícil de detectar.

Cómo funciona #[\\_Override]: El atributo #[\\Override] se usa para asegurar que el método en una clase derivada es realmente una sustitución de un método en la clase padre o una implementación de un método en una interfaz. Si un método marcado con #[\Override] no coincide con un método en la clase padre o interfaz, PHP generará un error, haciendo el problema inmediatamente aparente.

Ejemplo práctico:

clase A {
protected function ovrTest(): void {}
}

clase B extends A {
#[\Override]
public function ovrTest(): void {} // Correcto: sobrescribe la función ovrTest() de A
}

clase C extends A {
#[\Override]
public function ovrBest(): void {} // Error: ovrBest() no existe en A
}

Recuperación dinámica de constantes de clase y miembros de Enum

PHP 8.3 también ha simplificado la recuperación dinámica de constantes de clase y miembros de enum. Anteriormente, para obtener el valor de una constante de clase o miembro de enum usando una variable para el nombre, uno tenía que usar la función constante(). Este método era menos directo y podía resultar más complejo en algunos escenarios.

Ahora, con PHP 8.3, es posible acceder directamente a estas constantes y miembros usando una sintaxis más simple y directa:

clase MiClase {
public const THE_CONST = 9;
}

enum MiEnum: int {
case PrimerMiembro = 9;
case SegundoMiembro = 9;
}

$constantName = 'THE_CONST';
$memberName = 'PrimerMiembro';

echo MyClass::{$constantName}; // Acceso directo a la constante de la clase
echo MiEnum::{1TP4NombreMiembro}->valor; // Acceso directo al miembro del enum

Estas innovaciones en PHP 8.3, tanto el #[\Override] tanto la mejora en la recuperación dinámica de constantes, representan pasos importantes hacia un código más claro, seguro y mantenible.

PHP 8.3 introdujo un método innovador y útil para generar cadenas aleatorias: getBytesDeCadena(). Este método, añadido a la extensión Random de PHP, simplifica enormemente la creación de cadenas aleatorias a partir de un conjunto de caracteres predefinido.

Cómo funciona getBytesFromString(): La funcionalidad es bastante sencilla. Se proporciona una cadena de caracteres a partir de la cual dibujar y se especifica la longitud deseada para la cadena aleatoria. El método getBytesDeCadena() seleccionará aleatoriamente bytes de la cadena de origen hasta alcanzar la longitud especificada.

Ejemplos prácticos:

$rando = nuevo Random\Randomizer();
$alpha = 'ABCDEFGHJKMNPQRSTVWXYZ';

// Generar una cadena aleatoria de 6 caracteres a partir de $alpha
echo $rando->getBytesFromString($alpha, 6); // E.g.: 'MBXGWL'

Un aspecto interesante de getBytesDeCadena() es que permite generar cadenas aleatorias más largas que la cadena de entrada. Por ejemplo:

$rando = nuevo Random\Randomizer();
$nums = '123456';

// Generar una cadena aleatoria de 10 dígitos a partir de $nums
echo $rando->getBytesFromString($nums, 10); // Por ejemplo: '2526341615'.

Ponderación de caracteres en la entrada: Otro rasgo distintivo de este método es la posibilidad de "ponderar" los caracteres de la entrada. Si determinados caracteres aparecen con más frecuencia en la cadena de entrada, es más probable que se seleccionen en la cadena aleatoria. Por ejemplo:

$rando = nuevo Random\Randomizer();
$weighted = 'YYYY12345';

// Generar una cadena aleatoria en la que es más probable que aparezca "A
echo $rando->getBytesFromString($weighted, 5); // E.g.: '1AA53'

En conclusión, el getBytesDeCadena() en PHP 8.3 ofrece una solución simple y efectiva para generar cadenas aleatorias, con la flexibilidad de personalizar la distribución de caracteres y la longitud de la cadena resultante. Esto la convierte en una herramienta valiosa para una gran variedad de aplicaciones, desde el procesamiento de datos a seguridad informática.

Otros cambios y mejoras en PHP 8.3

Además de las importantes nuevas características ya comentadas, PHP 8.3 introduce una serie de mejoras y funcionalidades adicionales que enriquecen aún más el lenguaje. A continuación, destacamos algunas de estas actualizaciones menores que, a pesar de su pequeña escala, pueden tener un impacto significativo en el desarrollo cotidiano.

  1. Nuevos métodos para la clase DOMElement: PHP 8.3 mejora el manejo de DOM con métodos adicionales como DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertarTextoAdyacente()y otros, mejorando la manipulación de los nodos DOM.
  2. Actualizaciones de IntlCalendar: La clase IntlCalendar se ha ampliado con métodos como IntlCalendar::setFecha() e IntlCalendar::setHoraFecha()ofreciendo más flexibilidad en la gestión de las fechas.
  3. Funciones LDAP actualizadas: Las nuevas funciones ldap_connect_wallet() e ldap_exop_sync() ampliar las capacidades de integración LDAP.
  4. Mejoras en las funciones multibyte: La nueva función mb_str_pad() añade más opciones para la manipulación de cadenas multibyte.
  5. Nuevas funciones POSIX: Funciones como posix_sysconf() e posix_eaccess() se han introducido para mejorar la interacción con el sistema operativo.
  6. Nuevo método en ReflectionMethod: El método ReflectionMethod::createFromMethodName() ofrece más flexibilidad a la hora de reflejar los métodos.
  7. Funciones de socket actualizadas: La función socket_atmark() amplía las capacidades de conexión en red.
  8. Nuevas funciones para cadenas: str_increment(), str_decrement(), e estream_context_set_options() son algunas de las nuevas funciones introducidas para la manipulación de cadenas.
  9. Nuevo método en ZipArchive: ZipArchive::getArchiveFlag() añade nuevas posibilidades de gestión de archivos ZIP.
  10. Nueva configuración INI: La zend.max_allowed_stack_size permite configurar el tamaño máximo de la pila, lo que mejora la gestión de los recursos.

Depreciaciones en PHP 8.3

Cada nueva versión de PHP también trae consigo una lista de funciones y configuraciones que están obsoletas. Es importante tener en cuenta estas desaprobaciones, ya que el uso continuado de dichas funciones puede provocar advertencias en los registros y posibles problemas de compatibilidad.

Entre las desaprobaciones de PHP 8.3 se encuentran:

  • La corrección de la constante U_MULTIPLE_DECIMAL_SEPERATORS en U_SEPARADORES_DECIMALES_MÚLTIPLES.
  • La eliminación de la variante 3MT_RAND_PHP Mt19937.
  • Cambios en la ReflectionClass::getPropiedadesEstáticas().
  • Varios ajustes INI como assert.active, assert.bailetc., han quedado obsoletos.
  • Llamadas sin argumentos a get_class() e get_parent_class() han quedado obsoletos.

PHP 8.3 disponible en G Tech Group

En conclusión, PHP 8.3 representa un importante paso adelante en el desarrollo del lenguaje, introduciendo una serie de nuevas características, mejoras y desapariciones que son cruciales para modernizar y optimizar el código PHP. Con la incorporación de métodos más avanzados, una mayor flexibilidad y la introducción de nuevas funciones, PHP 8.3 se posiciona como una excelente opción para los desarrolladores que buscan mejorar el rendimiento y la seguridad de sus aplicaciones.

Para quienes utilizan servicios de alojamiento y servidores, tenemos buenas noticias: Grupo G Tech ya ha implementado PHP 8.3 en todos sus sistemas de alojamiento y servidores. Esto significa que, como cliente de G Tech Group, puede disfrutar inmediatamente de todas las ventajas que ofrece la última versión de PHP, sin necesidad de actualizaciones manuales ni configuraciones complejas.

Esta implementación forma parte del compromiso de G Tech Group de proporcionar las tecnologías más avanzadas y actualizadas a sus clientes, garantizando que sus proyectos estén siempre respaldados por las mejores y más recientes soluciones disponibles en el mercado. Con PHP 8.3 en G Tech Group, puede esperar un entorno de alojamiento robusto, seguro y de alto rendimiento, ideal para desarrollar y hacer crecer sus aplicaciones web.

Deja un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

G Tech Group nace conceptualmente en 2011 y empresarialmente en 2013 de una idea de Gianluca Gentile su fundador.

El objetivo era crear el primer Agencia Web Social no es una agencia web clásica que se ocupe de lo social, sino una agencia que comparte sus recursos e ideas con otras agencias y que también conecta a distintas agencias, creando una auténtica red.

Entradas recientes