2010-06-21 2 views
2

J'essaie de faire un petit CMS pour m'amuser, mais je suis en train de prendre du recul sur la sémantique avec la POO. J'ai une classe de base de données de base et puis j'ai une classe d'administrateur. La classe admin doit faire des requêtes de base de données, donc ce que j'ai fait c'est que la classe admin étende la classe db et passe ensuite le lien à la ressource db via construct. Mon code ressemble à ceci:Comment passer un lien de base de données MySQL à une classe en PHP?

class admin extends mysql { 
    function __construct($link) { 
     $this->link = $link; //$this->link is in the mysql class 
    } 
} 
$db = new mysql($host,$user,$pass,$name); 
$admin = new admin($db->link); 

Je sais qu'il devrait y avoir une méthode plus facile à cela sans extension de la classe db (que je suppose appels une toute nouvelle instance de celui-ci). Un ami m'a dit de passer tout l'objet $ db à la classe d'administration et y stocker comme ceci:

class admin { 
    var $db; 
    function __construct($db) { 
     $this->db = $db; 
    } 
} 

$db = new mysql($host,$user,$pass,$name); 
$admin = new admin($db); 

Est-ce la bonne façon de faire les choses? Existe-t-il un moyen plus simple de référencer le lien db s'il a déjà été établi?

Répondre

2

Oui, votre ami a absolument raison. Eh bien, il est plus correct que votre approche originale.

Ce que vous devez faire est d'aller plus loin et de créer une classe dont le travail seulement consiste à interroger ou mettre à jour la base de données et à retourner les résultats. Cette classe est responsable de l'organisation des requêtes (qui sont toutes preparedstatements); votre classe "admin" ne sait rien sur la façon de se connecter à ou interroger la base de données, seulement comment utiliser cette classe, que nous appellerons "data_layer".

Passez une instance de la classe data_layer à la classe admin dans le constructeur, et voilà! Vous avez fait un programme en couches. Toutes nos félicitations! Vous faites vos premiers pas vers un monde plus vaste.

0

Je serais enclin à déclarer et créer une instance de la classe de base de données dans la classe admin. La raison en est que les opérations effectuées sur la base de données par votre classe d'administration peuvent ne pas se mélanger avec d'autres accès à la base de données; la classe admin peut démarrer ou valider des transactions à des moments qui ne sont pas pratiques pour le reste de l'application, par exemple. Cela n'arrivera pas si la classe admin a sa propre connexion.

Questions connexes