Obsolescencia de propiedades dinámicas en PHP 8.2. ¿Qué implica? > Blog | Josep Salvà - Desarrollo Web

La palabra de Wifft

En los objetos de PHP, es posible asignar y obtener propiedades que no han sido previamente declaradas. Estas propiedades no se adhieren a nada en específico y requieren de los métodos mágicos __get() y __set() para prevenir o controlar como estas propiedades dinámicas son asignadas y obtenidas.

class User {
    private int $uid;
}

$user = new User;
$user->name = 'Wifft';

En el snipet de arriba, la clase User no declara ninguna propiedad con el nombre name, pero debido a que las propiedades dinámicas están permitidas, PHP permite dicha asignación.

Mientras que, por una parte, las propiedades dinámicas proporcionan flexibilidad a la hora de crear objetos como por ejemplo, el mapeo de una tabla de base de datos en función de sus campos, por otra abren la posibilidad de que se produzcan fallos potenciales o comportamientos inesperados en las aplicaciones. Por ejemplo, un error ortográfico en una declaración que asigna una propiedad puede pasar desapercibida debido a que PHP permite todas las propiedades dinámicas de manera silenciosa.

A partir de PHP 8.2 establecer un valor a una propiedad no declarada en la clase que instancia el objeto queda obsoleto y emite un aviso de deprecación la primera vez que la propiedad es asignada durante el flujo de ejecución del script.

Por ejemplo:

class User {
    private int $uid;
}

$user = new User;
$user->name = 'Wifft';

Produce:

Deprecated: Creation of dynamic property User::$name is deprecated in ... on line ...

Sin embargo, debido a razones de retrocompatibilidad (y para evitar que reescribir muchas librerías y frameworks ampliamente utilizados sea enormemnte costoso), existen tres excepciones a esta obsolescencia:

  1. El objeto stdClass y sus sub-clases.
  2. Classes que implementen el atributo #[AllowDynamicProperties]
  3. Clases que implementen los métodos mágicos __set y __get.

Obviamente, existen casos legítimos del uso de propiedades dinámicas, como por ejemplo objetos cuyos valores se obtienen a través de una respuesta JSON, pero por lo generar, no es una práctica a la que se deba recurrir de manera frecuente.