2010-10-08 8 views
0

Voici les bases de mon cadre:Dynamiquement classe de charge pour un accès global (comme CodeIgniter ne)

class CPU { 

    public function load_class($class) { 
     include_once($class . ".php"); 
     $this->$class = new $class; 
    } 

    public function load_controller($class) { 
     include_once($class . ".php"); 
     $class = new $class; 
     $class->index(); 
    } 

    public function run() { 

     // Load DB class 
     $this->load_class("DB"); 

     // Load controller 
     $this->load_controller("About"); 
    } 
} 

class About extends CPU { 
    public function index() { 
     $this->DB->connect(); 
    } 
} 

Lorsque run() est appelé à charger la classe About, l'accès $DB donne l'erreur ci-dessous:

Erreur fatale: Appel à une fonction membre connect() sur un non-objet

Je suppose que j'ai besoin d'utiliser un singleton pour créer la classe dynamiquement. CodeIgniter fonctionne de la même manière, mais je ne peux pas déterminer ce que je dois faire pour modifier mon cadre pour que cela fonctionne.

+0

Je ne vois aucun appel à 'run()' dans votre code. Edit: ne tenez pas compte de cela, j'ai mal lu. Définissez 'error_reporting (E_ALL);'. Je suppose que le modèle et le contrôleur ne sont pas dans le même dossier avec le processeur, non? – mhitza

Répondre

2

Je suggère d'utiliser __autoload() ou spl_autoload_register() pour charger vos classes au lieu de coder en dur include(). À propos de votre problème, la classe «À propos de» n'instancie jamais un membre de DB. Son parent, CPU, n'a pas non plus de membre DB. En d'autres termes, vous voulez probablement que DB soit membre du CPU ou de About. C'est difficile à dire sans savoir ce que vous essayez de faire.

Même si vous avez fait de DB un membre de l'une d'entre elles, vous devrez quand même l'ajouter à l'instance de la classe About qui est instanciée dans load_controller(). En d'autres termes, il semble que vous vous trompiez vraiment. Cette base de données n'a aucun lien avec About. Il est difficile de vous donner plus d'aide sans savoir exactement ce que vous essayez de faire. À propos de l'utilisation d'un singleton, cela n'a rien à voir avec quoi que ce soit. Un Singleton est juste une classe dont vous n'avez jamais besoin que d'un. Ils sont fréquemment surexploités et mal utilisés. Utiliser avec précaution!