JeuWeb - Crée ton jeu par navigateur
[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 :
<?php 
class WJoueur
{
public
$Name;
function
__construct($id) {if($id>0)$this->Name = 'toto'; else $this->Name = 'Neutre'; }
}

une classe planete:

Code PHP :
<?php 
class WPlanete
{
private
$Id_Joueur;
public
$Id_JoueurID;
public
$Id_Planete;
public
$Nom_Planete;

public function
__get($property)
{
$valeur=$property.'ID';//on créer la variable, ici: Id_Joueur + ID qui donnera bien Id_JoueurID
if(isset($this->$property))//si l'objet est remplit, on le renvoit normalement
return $this->$property;
elseif(isset(
$this->$valeur))//sinon, on regarde si la variable contenant l'ID est pleine, le cas échant on créer l'objet et on le renvoi
return new WJoueur($this->$valeur);
else
throw new
exception('Impossible de charger le sous objet '.$property);//si l'objet et l'id sont vides, on lance une erreur
}

function
__construct($id)
{
if(
$id>0) {
$this->CreerConnexion();//on créer la connection (peu importe comment)
$sql = "SELECT * FROM table WHERE Id_Planete='$id'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$data = mysql_fetch_array($req);

$this->Id_Joueur = NULL;//on met l'objet joueur à NULL
$this->Id_JoueurID = $data['Id_Joueur'];//on met en mémoire l'ID du joueur
$this->Id_Planete = $data['Id_Planete'];
$this->Nom_Planete = stripslashes($data['Nom_Planete']);
}}
}

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 Smile


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. Smile
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