2008-12-18 8 views
0

J'ai récemment pris mon code initiateur Db sur le __ construction de ma classe Page et l'ai placé juste après avoir initié la classe Page. Je l'ai retiré de la classe Page parce que je veux pouvoir y accéder de n'importe où (d'autres classes par exemple). Il prend également les arguments serveur, nom d'utilisateur, mot de passe et base de données lorsqu'il est initié, et je ne souhaite pas entrer ces derniers à chaque fois.PHP - Où est le meilleur endroit pour initier une classe de base de données?

Y a-t-il un moyen d'y accéder sous la classe Page maintenant? J'ai essayé quelques méthodes, même globales (ce qui m'a été dit est une manière terrible de faire des choses) et jusqu'ici aucun résultat. Je suis encore nouveau à OO, mais je m'enseigne du mieux que je peux.

Devrais-je en faire une classe statique? Cela affectera-t-il le connecteur paresseux au Db que j'ai configuré?

Toute aide serait grandement appréciée.

Merci

[EDIT]

Question similaire: Global or Singleton for database connection?

+0

J'ai posé une question similaire [Global ou Singleton pour la connexion à la base de données?] (Http://stackoverflow.com/questions/130878/global-or-singleton-for-database-connection) – Imran

Répondre

2

Un global de quelque sorte (que ce soit des variables globales, singleton ou une autre variante) est une amélioration par rapport à votre approche précédente, et en tant que tel, vous êtes sur la bonne voie. D'une manière générale cependant, vous devriez essayer de minimiser la portée de l'état du programme (pour un certain nombre de raisons, que je n'aborderai pas ici). Avoir une variable globale est en conflit avec ce principe. Il existe différentes solutions à ce problème, mais l'approche la plus puissante et souvent négligée consiste à utiliser l'inversion du contrôle; Au lieu d'obtenir une dépendance, votre classe devrait le recevoir. Par exemple, disons que vous avez actuellement ce

class EditUserController { 
    function saveUser() { 
    $db = Database::GetInstance(); 
    $db->execute("update users set ...", ...); 
    } 
} 

Vous pouvez changer cela en:

class EditUserController { 
    function saveUser($db) { 
    $db->execute("update users set ...", ...); 
    } 
} 

Passer les dépendances au niveau fonction paramètre peut être un peu difficile à manier cependant, un compromis pourrait donc être à le passer au niveau par objet:

class EditUserController { 
    protected $db; 
    function __construct($db) { 
    $this->db = $db; 
    } 
    function saveUser() { 
    $this->db->execute("update users set ...", ...); 
    } 
} 

Il s'agit d'un modèle assez commun dans la programmation OO. En plus d'être plus pratique que de transmettre des paramètres de fonction, il présente l'avantage supplémentaire de séparer la construction (lorsque les dépendances partagées sont câblées les unes avec les autres), de l'exécution (où elles sont utilisées). Cela rend beaucoup de choses plus simples.

+0

Je vois un verbe dans votre nom de classe. :( – DanMan

0

Les variables globales ont une utilisation, et ce serait l'un d'eux. À moins qu'il soit probable que vous aurez besoin de plusieurs connexions à la base de données (ou même encore), je ne vois pas de problème avec la configuration d'un objet $ db global.

Une manière alternative est d'avoir une classe "Factory" statique que vous pouvez utiliser pour obtenir l'objet. Dans Joomla 1.5, la façon dont vous accéder à l'objet DB est comme ceci:

$db =& JFactory::getDBO(); 

la fonction vérifie getDBO si l'objet DB a été créé: si elle a, renvoyer une référence à, sinon se connecter et initialisez, et puis retournez-le.

Cela peut également s'appliquer à d'autres objets "globalement possibles", comme l'objet Utilisateur actuel.

+0

Je vais faire une pause à développer quelque chose comme ça. J'ai vu le = & quelques fois mais je ne suis toujours pas sûr de ce que cela signifie. – alex

+0

il définit la variable comme une * référence *. Plus d'infos ici: http://www.php.net/manual/fr/language.references.return.php – nickf

+0

Je préfère un espace entre = et &, ce qui ne le fait pas ressembler à un nouvel opérateur. & venir après = le fait paraître plus confus (car ce n'est pas dans le même ordre que + =, - =, * = ou/=) – Imran

0

La méthode singleton a été créée pour s'assurer qu'il n'y avait qu'une seule instance de n'importe quelle classe. Mais, parce que les gens l'utilisent comme un moyen de raccourcir la mondialisation, il devient connu sous le nom de programmation paresseuse et/ou mauvaise.

Questions connexes