2009-09-13 5 views
1
  • Puis-je éviter instancier un objet Db à l'intérieur des noms objet pour y accéder de toute façon?
  • Est-ce que __autoload fonctionnerait pour cela?
  • Existe-t-il une autre solution intelligente?

je classes suivantes (Ils sont conceptuels afin qu'ils ne fonctionneront pas si elle est exécutée):base de données Autoload classe

Db { 
    function connect($config) { 
     // connect to data base 
    } 
    function query($query) { 
     // Process a query 
    } 
} 
Names { 
    function show_names($query) { 
     $Db = new Db(); // Is it possible to autoload this object? 
     $Db->query(query); 
     // Print data 
    } 
} 

Répondre

2

Les classes peuvent être chargées automatiquement, mais les objets doivent être instanciés. Il semble que votre problème soit d'essayer de rendre ces deux classes plus faiblement couplées. Probablement la solution la plus simple à ce problème utilise le modèle de conception Singleton. Cependant, ce n'est pas la meilleure solution, car vous pouvez décider d'avoir plus d'une connexion à une base de données, et cela devient également problématique dans les tests unitaires. Je suggère de jeter un oeil au concept de Dependency Injection, qui est plus compliqué, mais beaucoup plus flexible.

+0

Était vraiment le chemin pour moi d'aller. Ouvert un autre fil qui a montré le code que j'ai fait: http://stackoverflow.com/questions/1418605/dependency-injection-in-php – Cudos

2

Une solution qui est souvent utilisée pour les classes liées à la connexion de base de données est de travailler avec le Singleton Design Pattern (example of implementation in PHP).

Il permet d'avoir une classe qui encapsulera la connexion à la base de données, et garantira qu'une seule connexion est ouverte pour la durée de vie du script PHP - jamais plus.

Cela vous permettra d'utiliser une syntaxe comme ceci:

$db = Db::getInstance(); 
$db->query('...'); 

Ou:

Db::getInstance()->query('...'); 


A propos autoload: il fonctionnera, aussi longtemps que: il existe un moyen pour elle pour mapper le nom de la classe dans un fichier.