11-12-2008, 01:42 PM
(Modification du message : 26-12-2008, 02:53 PM par Sephi-Chan.)
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:
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']);
}}
}