Oui, le nom du sujet n'est pas très clair mais je ne voyais pas trop comment nommer ce que je vais décrire ci-dessous.
Je me suis essayé à faire un petit tuto en POO.
Y'a beaucoup de blabla pour pas grand chose, et le tout est pas forcément top. Mais c'est là
________________________________________________
Je m'explique : J'ai une classe qui peut être instanciée plusieurs fois ( Town). Ainsi, je peux créer plusieurs cités et les faire interagir (A donne de l'or à B, C attaque D, etc).
Mon problème est que j'ai besoin d'une instance de Town qui soit unique, et surtout qui soit accessible absolument partout (controllers, vues, ..)
Cette instance est la Cité Courante, la cité du joueur en cours. J'appellerai cette cité 'CurrTown'.
2 approches s'offraient à moi :
- Créer un objet Town global, mais je n'aime pas du tout cette pratique
- Créer un singleton Town. Cette méthode aurait pu me convenir, mais je n'avais pas envie de faire des get_instance à tout va.
J'ai donc créé une 3ème possibilité, une classe statique qui me permet de travailler comme si je travaillais sur une classe Town, à quelques détails près.
Pour info, voici le code de ma classe Town (celle qui peut être instanciée), épuré pour le post :
Je me suis essayé à faire un petit tuto en POO.
Y'a beaucoup de blabla pour pas grand chose, et le tout est pas forcément top. Mais c'est là
________________________________________________
Je m'explique : J'ai une classe qui peut être instanciée plusieurs fois ( Town). Ainsi, je peux créer plusieurs cités et les faire interagir (A donne de l'or à B, C attaque D, etc).
Mon problème est que j'ai besoin d'une instance de Town qui soit unique, et surtout qui soit accessible absolument partout (controllers, vues, ..)
Cette instance est la Cité Courante, la cité du joueur en cours. J'appellerai cette cité 'CurrTown'.
2 approches s'offraient à moi :
- Créer un objet Town global, mais je n'aime pas du tout cette pratique
- Créer un singleton Town. Cette méthode aurait pu me convenir, mais je n'avais pas envie de faire des get_instance à tout va.
J'ai donc créé une 3ème possibilité, une classe statique qui me permet de travailler comme si je travaillais sur une classe Town, à quelques détails près.
Pour info, voici le code de ma classe Town (celle qui peut être instanciée), épuré pour le post :
Code PHP :
<?php
class Town
{
// Ressources pour le calcul
private
$time_ellapse = 0,
$gold_per_hour = 0,
$products_per_hour = 0,
$population = 0,
$taken_population = 0,
$taken_boxes= 0,
$free_boxes = 0;
// Attributs de la cité (or, products etc provenant de la DB)
private $attributs = array();
public function __construct($id = false)
{
if (!$id) return false;
// Récupération de la cité en DB
$town = Towns::retrieveById($id, ORM::FETCH_ONE);
if ($town == NULL) return false;
// Parcours de tous les attributs de la cité, qu'on place dans $this->attributs
foreach (get_object_vars($town) as $key => $value)
{
$this->attributs[$key] = $value;
}
}
private function SaveTown()
{
// Enregistrement des attributs en BDD
}
public function __isset($name)
{
return (isset($this->attributs[$name])) ? true : false;
}
public function __get($name)
{
return (isset($this->attributs[$name])) ? $this->attributs[$name] : false;
}
public function __set($name, $value)
{
$this->attributs[$name] = $value;
}
}
La partie intéressante dans ce code est la présence du tableau 'attributs'.
Dans le __construct, on récupère la cité stockée en DB, et on stocke dans l'attribut 'attributs' de la classe toutes les valeurs de la cité.
Attention à $town = Towns::retrieveById($id, ORM::FETCH_ONE);
La classe Towns est le modèle qui me permet de récupérer mes cités par l'ORM, rien à voir avec ce post.
Sorti du construct, $this->attributs contient à peu près :
'id' => 25,
'name' => 'Cité de Max',
'gold' => 100,
'products' => 50,
etc etc
Je ne détaillerai pas les __isset() et autres méthodes magiques, le tout est de savoir que tout attribut inaccessible est recherché et/ou défini dans l'array 'attributs'.
Sinon, pour instancier la classe, rien de plus facile :
Code PHP :
<?php
$town = new Town($id_de_la_cite);