Novedades de PHP 8.2: Recursos y mejoras

Novedades de PHP 8.2: Recursos y mejoras

Continuando con el artículo anterior sobre actualizaciones de PHP, profundizaremos nuestro análisis de las nuevas características y mejoras de la versión 8.2, lanzada el 8 de diciembre de 2022.

Esta nueva versión trae consigo una serie de innovaciones y características, entre las que destacan las clases de solo lectura, la introducción de null, false y true como tipos independientes y la desaprobación de propiedades dinámicas, además de muchas otras mejoras significativas.

También es importante recalcar la importancia que tiene el rendimiento para los usuarios a la hora de utilizar el lenguaje PHP para crear sistemas.

Como siempre, el rendimiento es un área que recibió especial atención en esta nueva versión y puedes consultar los resultados de las pruebas comparativas en este link.

Te invito a disfrutar de la lectura para mantenerte actualizado con las nuevas características y mejoras que trae la versión 8.2 de PHP.


Nuevos recursos

Readonly classes

En la nueva versión, una clase se puede marcar con el modificador de solo lectura, lo que introduce una característica importante en PHP.

Al marcar una clase como de solo lectura, el modificador de solo lectura se aplica a todas las propiedades declaradas dentro de esa clase, lo que a su vez impide la creación de propiedades dinámicas.

Usar el modificador de solo lectura es particularmente útil cuando se requiere inmutabilidad.

Esto significa que una vez que se establecen los valores de las propiedades, no se pueden cambiar más adelante. Esto agrega una capa de seguridad e integridad a los datos contenidos en la clase.

Una característica importante a tener en cuenta es que al marcar una clase como readonly es que es imposible agregar soporte para propiedades dinámicas utilizando el atributo AllowDynamicProperties. Esto garantiza que se mantenga la inmutabilidad y que las propiedades no se puedan modificar ni agregar aleatoriamente durante la ejecución del programa.

El uso de clases de solo lectura en PHP puede resultar ventajoso en varias situaciones.

Algunas de las razones por las que podrías considerar utilizar una clase de solo lectura incluyen:

  1. Inmutabilidad de datos: Cuando desees asegurarte de que los datos contenidos en la clase permanezcan sin cambios después de la inicialización.
  2. Seguridad e Integridad: Para evitar modificaciones accidentales o maliciosas a las propiedades de la clase, garantizando la integridad de los datos.
  3. Facilidad de Rastreo: Para simplificar el seguimiento de errores y la depuración, ya que las propiedades no cambian durante la ejecución.
  4. Patrones de Design: Se ajusta a patrones de diseño que requieren inmutabilidad, como el Principio de Responsabilidad Única (SRP - una clase debe tener sólo una responsabilidad, es decir, debe ser responsable de realizar sólo una tarea) y el Principio de Sustitución de Liskov (LSP - las subclases deben ser pueden usarse indistintamente con sus superclases sin comprometer la integridad).

En resumen, la capacidad de marcar una clase como de solo lectura en PHP proporciona una solución valiosa para garantizar la inmutabilidad de los datos y hacer cumplir la seguridad e integridad del código. Esto puede resultar particularmente útil en escenarios donde la modificación de datos debe controlarse y monitorearse estrictamente.

Sintaxis de la clase Read-only

En versiones anteriores, una clase se podía definir como en el siguiente código:

class BlogData
{
    public readonly string $title;

    public readonly Status $status;

    public function __construct(string $title, Status $status)
    {
        $this->title = $title;
        $this->status = $status;
    }
}

Configurar la misma clase como de solo lectura es fácil en la nueva versión:

readonly class BlogData
{
    public string $title;

    public Status $status;

    public function __construct(string $title, Status $status)
    {
        $this->title = $title;
        $this->status = $status;
    }
}


Disjunctive Normal Form (DNF) Types

La adición de tipos DNF (Disjunctive Normal Form) representa un avance importante en la flexibilidad del lenguaje. Estos tipos permiten la combinación de tipos de unión e intersección, lo que proporciona un enfoque dinámico y potente para definir parámetros de funciones.

Al incorporar tipos DNF en tus firmas de funciones, se logra la capacidad de hacer que estas firmas sean más dinámicas y adaptables. La flexibilidad resultante es muy importante en un contexto de lenguaje de programación de tipo dinámico como PHP, donde la definición de tipo estricta puede usarse menos.

Esta funcionalidad brinda la oportunidad de especificar una variedad de tipos de datos que un parámetro puede aceptar, lo que a su vez mejora la modularidad del código y facilita la reutilización de funciones en diferentes contextos.

La capacidad de utilizar tipos DNF en PHP proporciona una mayor expresividad en las firmas de funciones, haciendo que el código sea más claro y conciso. Además, contribuye a la legibilidad del código, reflejando con precisión los requisitos del programa.

Por lo tanto, incorporar tipos DNF en PHP no sólo mejora la flexibilidad del lenguaje, sino que también fortalece la adaptabilidad del código, proporcionando a los desarrolladores una poderosa herramienta para crear funciones más dinámicas y versátiles.

En versiones anteriores, si necesitaba permitir parámetros de múltiples tipos de variables al mismo tiempo, se requería algo como lo siguiente:

class Foo {
    public function bar(mixed $entity) {
        if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
            return $entity;
        }

        throw new Exception('Invalid entity');
    }
}


Ahora es posible determinar directamente en el parámetro qué tipos se aceptan:

class Foo {
    public function bar((A&B)|null $entity) {
        return $entity;
    }
}


Así, definimos que el parámetro $entity puede ser de tipos A y B o de tipo null.

Esta es una excelente manera de aumentar la flexibilidad y la reutilización del código.

Allow null, false, and true as stand-alone types

Un cambio significativo en la nueva versión de PHP se refiere a la definición de retornos de métodos. Anteriormente, tenías que especificar la devolución como bool u opcional null.

Ahora con la actualización se abre la posibilidad de configurar la devolución directamente como null, false o true. Este cambio simplifica la definición de retornos de métodos, lo que hace que el código sea más legible y conciso.

Estas mejoras contribuyen a la adaptabilidad de PHP y mejoran la experiencia de desarrollo. Al permitir a los desarrolladores expresar sus intenciones de forma más clara y concisa, PHP se convierte en un lenguaje más flexible y potente para crear aplicaciones dinámicas y eficaces. Por tanto, la incorporación de tipos DNF y las mejoras en la definición de retornos de métodos representan avances significativos en la evolución de PHP.

Versiones anteriores a la 8.2:

class Falsy
{
    public function almostFalse(): bool { /* ... */ *}

    public function almostTrue(): bool { /* ... */ *}

    public function almostNull(): string|null { /* ... */ *}
}


En la versión actual podemos hacer lo siguiente:

class Falsy
{
    public function alwaysFalse(): false { /* ... */ *}

    public function alwaysTrue(): true { /* ... */ *}

    public function alwaysNull(): null { /* ... */ *}
}


De esta manera, el código fuente se vuelve más legible y claro, ¡disfruta de la nueva funcionalidad!

Constants in traits

Traits son tipos especiales de clases introducidas en la versión 5.4.

Son ampliamente reconocidos por su capacidad para promover la reutilización del código fuente entre clases que no comparten una relación jerárquica directa. Esto se traduce en un enfoque eficaz para mantener el código fuente conciso y altamente reutilizable, mejorando la modularidad y la capacidad de mantenimiento del código.

Una innovación importante en la última versión es la capacidad de incorporar constantes dentro de los traits. Esto es importante ya que permite registrar información crítica e inmutable directamente en el contexto de ellos.

Las constantes se pueden utilizar para definir valores que no deben cambiarse durante la ejecución del programa, lo que contribuye a la claridad del código y garantiza la integridad de los datos.

Es importante resaltar que la accesibilidad de estas constantes tiene una particularidad. No se puede acceder a ellos directamente desde el nombre del trait. En cambio, la referencia a estas constantes debe hacerse a través de una clase que incorpore el trait en cuestión. Este diseño ayuda a evitar conflictos de nombres y garantizar que las constantes se utilicen de forma adecuada y contextualmente correcta.

Esta adición de constantes en traits ofrece una forma más organizada y segura de almacenar información esencial y no modificable, lo que contribuye a un código más sólido y fácil de mantener.

trait Foo
{
    public const CONSTANT = 1;
}

class Bar
{
    use Foo;
}

var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error



Deprecate dynamic properties

La depreciación de funciones en un lenguaje de programación juega un papel clave para mejorar la calidad del código y guiar a los desarrolladores hacia buenas prácticas. Es una estrategia crucial para hacer que los desarrolladores planifiquen y diseñen con más cuidado la estructura del sistema en desarrollo.

En versiones más recientes, como la nueva versión, un ejemplo de desaprobación importante tiene que ver con el intento de crear una nueva propiedad que no estaba definida previamente en la clase. Ahora, cuando los desarrolladores intentan crear una propiedad no declarada en la clase, se emite una advertencia de obsolescencia. Esta advertencia pretende señalar que la práctica de agregar propiedades dinámicamente se está volviendo obsoleta, animando a los desarrolladores a adoptar un enfoque más estructurado y cuidadoso al diseñar sus clases.

La importancia de esta depreciación está ligada a promover mejores prácticas de programación y prevenir errores que pueden surgir al crear propiedades dinámicamente sin una planificación previa. Este cambio ayuda a fortalecer la calidad del código, haciéndolo más seguro, legible y fácil de mantener.

En resumen, introducir advertencias de obsolescencia, como en el caso de la creación de propiedades indefinidas en clases, es un enfoque eficaz para guiar a los desarrolladores hacia la escritura de código más estructurado y robusto, contribuyendo a la evolución continua del lenguaje de programación y a mejorar la calidad del software.

class User
{
    public $name;
}

$user = new User();
$user->last_name = 'Doe'; // Deprecated notice

$user = new stdClass();
$user->last_name = 'Doe'; // Still allowed


Esta actualización no afecta el uso de getters y setters.

Todavía es posible utilizar propiedades dinámicas usando la anotación #[\AllowDynamicProperties].

Nuevas clases, interfaces y funciones

Se han incluido nuevas clases, interfaces y funciones, que puedes consultar a continuación:

  1. Nueva función mysqli_execute_query y método mysqli::execute_query.
  2. Nuevos atributos #[\AllowDynamicProperties] y #[\SensitiveParameter].
  3. Nuevos métodos ZipArchive::getStreamIndex, ZipArchive::getStreamName y ZipArchive::clearError.
  4. Nuevos métodos ReflectionFunction::isAnonymous y ReflectionMethod::hasPrototype.
  5. Nuevas funciones curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.


Depreciaciones y ruptura de compatibilidad con versiones anteriores

A continuación se muestran algunas desaprobaciones y fallos de compatibilidad en esta versión:

  1. Descontinuada la interpolación de string ${}.
  2. Funciones utf8_encode y utf8_decode descontinuadas.
  3. Los métodos DateTime::createFromImmutable y DateTimeImmutable::createFromMutable tienen un tipo de retorno tentativo como estático.
  4. Las extensiones ODBC y PDO_ODBC ahora escapan al nombre de usuario y la contraseña.
  5. Las funciones strtolower y strtoupper ya no son sensibles a la ubicación.
  6. Los métodos SplFileObject::getCsvControl, SplFileObject::fflush, SplFileObject::ftell, SplFileObject::fgetc y SplFileObject::fpassthru ahora exigen firma.
  7. El método SplFileObject::hasChildren tiene un retorno tentativo de false.
  8. El método SplFileObject::getChildren tiene un retorno tentativo de null.
  9. El método interno SplFileInfo::_bad_state_ex fue descontinuado.

Conclusión

La nueva actualización supone un hito importante en la mejora de PHP, ofreciendo mejoras sustanciales en términos de rendimiento y funcionalidad que benefician tanto a los desarrolladores como a los proyectos en desarrollo.

Estos cambios no solo agilizan la ejecución del código existente, sino que también promueven prácticas de programación más estructuradas y una reutilización eficiente del código.

Las mejoras de rendimiento ayudan a acelerar la ejecución de scripts y aplicaciones, haciendo que PHP sea aún más eficiente en su procesamiento. Esto se traduce en tiempos de respuesta más rápidos y una experiencia más receptiva para los usuarios finales.

Además, las nuevas funciones, como la capacidad de agregar tipos de forma normal disyuntiva (DNF) y advertencias de obsolescencia, facilitan la escritura de código de alta calidad. Animan a los desarrolladores a planificar y estructurar sus clases y funciones con más cuidado, promoviendo la cohesión, la modularidad y la reutilización del código.

Si deseas ver más detalladamente las modificaciones específicas de la nueva versión, recomiendo visitar el sitio oficial del release. Allí encontrarás documentación detallada y notas de la versión que profundizan en cada cambio y funcionalidad introducidos.

Espero que este resumen haya sido informativo y útil.

Actualizar PHP es una gran oportunidad para mejorar la calidad y el rendimiento de su código.

¡Gracias por seguir este artículo y hasta la próxima!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.