Retour aux articles
Php

Utiliser les propriétés dynamiques en PHP 8.2

En tant que développeur PHP, vous avez probablement déjà (sûrement) utilisé les propriétés dynamiques. C'est une fonctionnalité qui existe depuis PHP 5.3 et qui permet d'accéder à des propriétés d'un objet de facon dynamique et à la volée.

Nous pouvons avoir un exemple de code comme celui-ci :

class User
{
public $name;
public $email;
public $password;
 
public function __construct($name, $email, $password)
{
$this->name = $name;
$this->email = $email;
$this->password = $password;
 
$this->address = '40 Rue Fanfan la Tulipe, Boulogne-Billancourt';
}
}
 
$user = new User(
'Arthur Monney',
'demo@gmail.com',
'password'
)
 
$user->address; // 40 Rue Fanfan la Tulipe, Boulogne-Billancourt

Si vous essayez d'assigner une propriété inexistante à un objet (comme le cas avec la propriété address), PHP créera automatiquement une propriété correspondante. Cette propriété créée dynamiquement ne sera disponible que pour cette instance de classe.

Problématique

Et vous voyez ce bout de code qu'on vient d'écrire ? Eh bien avec PHP 8.2 cela est déprécié (et potentiellement même plus fonctionnel sur les versions à venir de PHP). Vous pouvez l'écrire et ça fonctionne, mais je vous le déconseille fortement. Avec PHP 8.2, nous avons un typage fort ce qui permet d'améliorer grandement la lecture et compréhension du code. Et surtout cela évite de se retrouver avec des erreurs inattendues comme cela peu être le cas avec le JavaScript par exemple.

Propriétés dynamiques sur PHP 8.2

Mais des cas spécifiques peuvent apparaitre et nous pouvons avoir besoin d'utiliser les propriétés dynamiques. Et c'est là que PHP 8.2 nous apporte une solution. Je prends un exemple de code test sur PestPHP quand nous avons besoin d'utiliser les fonctions beforeEach et afterEach pour nos tests.

beforeEach(function (): void {
$this->user = Teacher::factory()->create();
 
$this->headers = [
'Accept' => 'application/json',
'Content-Type' => 'application/json',
];
 
actingAs($this->user);
});

Si votre IDE est configuré sur un support de PHP 8.2, vous allez voir la propriété $this->user soulignée en rouge avec un message d'erreur. Mais si vous exécutez le code, vous n'aurez pas d'erreur. Alors pour éviter cela, il est recommandé de marquer sa classe avec l'attribut #[\AllowDynamicProperties] Et pour le cas du code précédent, il faudra rajouter cet attribut sur la classe de test TestCase cela donnera :

declare(strict_types=1);
 
namespace Tests;
 
use AllowDynamicProperties;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
 
#[AllowDynamicProperties]
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
}

Mais hormis ce cas spécifique, il est recommandé de déclarer la propriété à la place. Mais si vous en avez besoin, vous pouvez toujours utiliser les attributs.