[PHP][POO] Lazy loading - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : [PHP][POO] Lazy loading (/showthread.php?tid=3416) |
[PHP][POO] Lazy loading - Wells - 11-12-2008 Bonjour à tous, aujourd'hui nous allons abordé un mécanisme du langage objet que tout le monde ne connait/maitrise pas forcément alors qu'il est indispensable dans beaucoup de cas. Je veux parlez du lazy loading (littéralement: chargement paresseux). Ce concept est en fait tout simple: on ne charge un sous objet que lorsqu'on l'appelle. 1. Quels intérêts: - du fait que le chargement ne se produit que lors de l'utilisation on désengorge le serveur. - cela permet d'éviter les boucles de chargements infinis du style: objet A qui contient Objet B qui contient objet A. Ce genre de boucles peuvent vous faire monter en mémoire la moitié de votre BDD si vous n'y prêtez pas attention 2. Méthodologie: Si je me suis décidé à faire ce petit tuto, c'est qu'après moult recherche sur le web, je ne suis tombé sur rien de satisfaisant en PHP5. Il existe d'autres techniques de lazy loading mais pour moi elles sont plus compliqué et moins "logique". Le principe de ma méthode est simple: a. on déclare le sous objet à NULL b. on déclare une variable "ID" qui servira uniquement de récipient à l'id de liaison c. on intercepte dans le getter le chargement de l'objet et on fait les traitements adéquats. 3. Exemple concret: Comme un bon exemple vaux mieux qu'un long discours allons y. Soit deux classes: une classe joueur: Code PHP :
une classe planete: Code PHP :
On créer notre instance ainsi: $xavier = new WPlanete(4); A ce moment la, l'objet joueur n'est pas charger. C'est au moment ou vous ferez: $xavier->Id_Joueur-Name que le chargement (et donc la requête SQL) se fera. En espérant que cela vous sera utile RE: [Objet] Lazy loading - Karedas - 11-12-2008 Un grand merci à toi, je vais mettre en place du lazy loading sur tout mes classes, ce qui sera pas du luxe vu le nombre de sous objets que j'utilise. J'ai juste du apporter une petite modif pour que ça marche chez moi, si je declare le sous objet à null, ça ne marche pas, si je ne le déclare pas du tout ça marche. Du coup, je le déclare dans le __get avant de le renvoyer et tout va bien à première vue. RE: [Objet] Lazy loading - Wells - 11-12-2008 Hum étrange, j'ai codé le chargement avec NULL sans aucun soucis. Peu etre la version de PHP diffère... RE: [Objet] Lazy loading - Zamentur - 13-12-2008 super principe, j'y penserai... RE: [Objet] Lazy loading - Sephi-Chan - 13-12-2008 Ah oui, c'est sympa comme technique. Un peu galère à mettre en place mais quand c'est fait, on a plus à y revenir! J'avais entendu parler de ça lors de mon projet de groupe à l'école, les développeurs (Java) parlaient de son implémentation avec Struts ou Hibernate, je crois. Sephi-Chan |