Accès une instance depuis une classe

Mammouth du PHP | 531 Messages

13 avr. 2010, 13:17

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'];
	}
}
?>

ViPHP
ViPHP | 4039 Messages

13 avr. 2010, 14:04

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)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 531 Messages

13 avr. 2010, 14:16

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;
	}

Mammouth du PHP | 1511 Messages

22 avr. 2010, 11:52

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
Modifié en dernier par momox le 22 avr. 2010, 11:53, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 avr. 2010, 11:53

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 )
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1511 Messages

22 avr. 2010, 11:59

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 avr. 2010, 12:18

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1511 Messages

22 avr. 2010, 13:11

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... :?