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.