A la découverte des lazy proxy et lazy ghost objets de PHP 8.4

JoliCode - JoliCodeBlog - 26/03
Parmi toutes les nouvelles fonctionnalités de PHP 8.4, nous souhaitions vous faire découvrir les différents usages de la RFC "Lazy Objects". Cette RFC a été conduite par Arnaud Le Blanc, contributeur au cœur de PHP, et Nicolas Grekas, contributeur principal de Symfony.

Parmi toutes les nouvelles fonctionnalités de PHP 8.4, nous souhaitions vous faire découvrir les différents usages de la RFC « Lazy Objects ». Cette RFC a été conduite par Arnaud Le Blanc, contributeur au cœur de PHP, et Nicolas Grekas, contributeur principal de Symfony.

Section intitulée que-signifie-em-lazy-loading-emQue signifie Lazy Loading ?

En informatique – mais pas uniquement, 👋 la procrastination – nous aimons délayer au plus tard possible l’utilisation de ressources. C’est-à-dire que nous souhaitons économiser au maximum des cycles CPU, de la consommation de mémoire, des IO tant que nous n’en avons pas besoin.

Prenons un exemple simple : sur une page web très longue, il est inutile de charger toutes les images dès l’ouverture. Il est probable que l’utilisateur ne scrolle jamais jusqu’en bas. En retardant le chargement des images, nous évitons plusieurs requêtes HTTP, ce qui allège le réseau.

C’est là qu’intervient le terme lazy. On reporte une tâche à plus tard. Par exemple, on ne charge les images que si l’utilisateur commence à faire défiler la page.

Dans cet article, nous allons voir ce que PHP 8.4 nous propose pour rendre notre code lazy.

Section intitulée un-peu-d-histoireUn peu d’histoire

Il n’y avait pas besoin d’attendre PHP 8.4 pour avoir des objets lazy. Nous pouvons déjà le faire dans notre propre code :

final readonly class CartRepository { private Redis $redis; public function __construct( private string $host, ) { } public function isCartExpired(Cart $cart): bool { // de la logique qui n'a pas besoin de $this->redis return true; } public function save(Cart $cart) { $this->redis()->hMSet($cart->id, $cart->toArray()); } public function get(string $cartId): Cart { return Cart::FromArray(...$this->redis()->hGetAll($cartId)); } private function redis(): \Redis { if (isset($this->redis)) { return $this->redis; } $this->redis = new \Redis(); $this->redis->connect($this->host); return $this->redis; } }

Dans la classe CartRepository, la connexion au serveur Redis est ouverte uniquement lorsque le code en a réellement besoin. Un appel à la méthode isCartExpired() n’ouvrira pas la connexion, contrairement aux méthodes save() ou get().

Bien que fonctionnel, ce genre de code est pénible à écrire, source de discussions, et n’apporte pas beaucoup de valeur ajoutée au produit.

C’est pourquoi des bibliothèques ont vu le jour pour simplifier l’écriture de ce type ...
[Courte citation de 8% de l'article original]

Loading...