0 votes

PHP - Quel est le meilleur endroit pour commencer un cours sur les bases de données ?

J'ai récemment retiré mon code d'initialisation de la base de données de la __construct de ma classe de page et je l'ai placé juste après l'initialisation de la classe de 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 les saisir à chaque fois.

Existe-t-il un moyen d'y accéder à partir de la classe Page ? J'ai essayé quelques méthodes, même globales (dont on m'a dit que c'était une façon horrible de faire les choses) et jusqu'à présent sans résultat. Je suis encore novice en matière d'OO, mais je me forme du mieux que je peux.

Dois-je en faire une classe statique ? Est-ce que cela affectera le connecteur paresseux à la base de données que j'ai mis en place ?

Toute aide serait très appréciée.

Merci de votre attention.

[EDIT]

Question similaire : Global ou Singleton pour la connexion à la base de données ?

2voto

troelskn Points 51966

Un global d'une sorte ou d'une autre (qu'il s'agisse de variables globales, de singleton ou d'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. En général, 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). Le fait d'avoir une variable globale est en contradiction 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 de contrôle ; au lieu d'obtenir une dépendance, votre classe devrait la recevoir. Par exemple, disons que vous avez actuellement ceci

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

Vous pourriez changer cela en :

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

Transmettre les dépendances au niveau des paramètres de la fonction peut cependant s'avérer un peu lourd, c'est pourquoi un compromis pourrait consister à les transmettre au niveau de chaque 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 courant dans la programmation OO. Outre le fait qu'il est plus pratique que de passer des paramètres de fonction, il présente l'avantage supplémentaire de séparer la construction (où les dépendances partagées sont reliées les unes aux autres) de l'exécution (où elles sont utilisées). Cela simplifie beaucoup de choses.

0voto

nickf Points 185423

Les variables globales ont leur utilité, et ce serait l'une d'entre elles. A moins qu'il ne soit probable que vous ayez besoin de plusieurs connexions à la base de données (ou même encore), je ne vois pas de problème à mettre en place un objet global $db.

Une autre solution consiste à disposer d'une classe statique "Factory" que vous pouvez utiliser pour obtenir l'objet. Dans Joomla 1.5, la façon d'accéder à l'objet DB est la suivante :

$db =& JFactory::getDBO();

la fonction getDBO vérifie si l'objet DB a été créé : si c'est le cas, elle renvoie une référence à cet objet, sinon elle se connecte et s'initialise, puis renvoie l'objet.

Cela pourrait également s'appliquer à d'autres objets "susceptibles d'être rendus globaux", comme l'objet Utilisateur actuel.

0voto

La méthode singleton a été créée pour s'assurer qu'il n'existe qu'une seule instance d'une classe. Mais parce que les gens l'utilisent comme un moyen de raccourcir la globalisation, elle devient connue comme une programmation paresseuse et/ou mauvaise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X