Page 1 sur 1

Accès une instance depuis une classe

Posté : 13 avr. 2010, 13:17
par supercanard
Bonjour,
Je suis confronté a un petit problème assez simple en fait, auquel j'ai une solution mais qui n'est peut être pas forcément la bonne.

J'ai une classe config chargé de récupérer des paramètres dans ma BDD.
Comme j'ai besoin des paramètres de configuration dans la globalité de mon site, je créé l'objet $config dans l'index.
Le problème est que j'ai aussi besoin de certains paramètres au sein de mes autres classes et qu'a moins de déclarer $config comme global ( c'est mal je crois... ) il faut donc que je recréé l'objet $config la ou j'en ai besoin dans mes classes.

Vous allez me dire ou est le problème ? Le problème et qu'a cache création d'une instance $config je fait des requêtes sur ma BDD pour récupérer les paramètres de configuration. C'est donc assez bête de devoir exécuter x fois les mêmes requêtes alors que je l'ai déjà fait auparavant.

J'avais envisagé comme solution ( voir code plus bas ) de passer ma méthode getParam en public et static afin de pouvoir l'exécuter depuis une autre classe pour ne récupérer uniquement le paramètre dont j'ai besoin.
A moins que je puisse accéder a mon instance $config créée dans l'index depuis une classe, mais je ne vois pas comment ?

Avez-vous une autre piste ?
<?php
class config{
	private $modules;
	private $nomSite;
	private $descriptionSite;
	
	public function __construct(){
		$this->modules = $this->getModules();
		$this->nomSite = $this->getParam('nom_site');
		$this->descriptionSite = $this->getParam('description_site');
	}
	
	public function getModule($cle){
		return $this->modules[$cle];
	}
	public function getEtatModule($cle){
		return $this->modules[$cle]['etat'];
	}
	public function getNomSite(){
		return $this->nomSite;
	}
	public function getDescriptionSite(){
		return $this->descriptionSite;
	}
	
	private function getModules(){
		$modules = array();
		$val = array();
		$bdd = bdd::getInstance()->prepare("SELECT * FROM module");
        $bdd->execute($val);
		while($row = $bdd->fetch(bdd::FETCH_ASSOC)){
			$modules[$row['cle']] = $row;
		}
		return $modules;
	}
	
	private function getParam($cle){
		$val = array(':cle' => $cle);
		$bdd = bdd::getInstance()->prepare("SELECT valeur FROM config WHERE cle = :cle");
        $bdd->execute($val);
		$row = $bdd->fetch(bdd::FETCH_ASSOC);
		return $row['valeur'];
	}
}
?>

Re: Accès une instance depuis une classe

Posté : 13 avr. 2010, 14:04
par Berzemus
Pourquoi ne pas en faire un singleton ?

Ainsi, a chaque nouvelle instanciation, c'est a chaque fois le même objet qui est renvoyé, et non un nouveau :mrgreen:

(un cas d'école pour le singleton, à mon avis)

Re: Accès une instance depuis une classe

Posté : 13 avr. 2010, 14:16
par supercanard
Le pire c'est que j'ai fait un singleton pour PDO...
Je sais pas pourquoi j'y ai pas pensé, merci =)
public static function getInstance() {
		if (!isset(self::$instance)){
			self::$instance = new config();
		}
		return self::$instance;
	}

Re: Accès une instance depuis une classe

Posté : 22 avr. 2010, 11:52
par momox
Le isset sur le self::$instance n'est pas très académique...
Un
self::$instance instanceof config
ne serait t'il pas plus approprié ?

Voir > http://php.net/manual/fr/language.operators.type.php

Re: Accès une instance depuis une classe

Posté : 22 avr. 2010, 11:53
par zeus
pas vraiment puisque le $instance doit être private

Toutefois, je suis d'accord avec toi sur le fait que c'est plus propre.
Mais tant qu'à aller dans cette voie, j'écrirais plutôt ça :
if( !self::$instance instanceof self )

Re: Accès une instance depuis une classe

Posté : 22 avr. 2010, 11:59
par momox
pas vraiment puisque le $instance doit être private
Même si il est private, vu qu'il n'utilise pas de factory, que tu sois en static ou en instance, la visibilité de la variable $instance de la classe config n'influe pas sur son accès depuis un membre de la classe config.
Surtout que le getInstance est a mon avis un membre de sa classe.

Re: Accès une instance depuis une classe

Posté : 22 avr. 2010, 12:18
par zeus
Ce que je veux dire, c'est qu'avec la visibilité private, et avec une implémentation stricte du singleton, tu n'est pas sensé avoir une autre instance que celle de l'objet courant dans cet attribut.

Re: Accès une instance depuis une classe

Posté : 22 avr. 2010, 13:11
par momox
Ce que je veux dire, c'est qu'avec la visibilité private, et avec une implémentation stricte du singleton, tu n'est pas sensé avoir une autre instance que celle de l'objet courant dans cet attribut.
Vi, je n'ai pas supposé le contraire non plus je crois... :?