2011-05-11 3 views
4

J'utilise la classe suivante pour charger automatiquement toutes mes classes. Cette classe étend la classe de base.Instancier un nouvel objet à partir de la variable

class classAutoloader extends SH_Core { 

    public function __construct() { 
     spl_autoload_register(array($this, 'loader'));  
    } 

    private function loader($class_name) { 
     $class_name_plain = strtolower(str_replace("SH_", "", $class_name)); 
     include $class_name_plain . '.php'; 
    } 
} 

J'instancier cette classe dans la __construct() de ma classe de base:

public function __construct() { 
    $autoloader = new classAutoloader(); 
} 

Maintenant, je veux être en mesure d'instancier des objets dans la classe du chargeur comme ceci:

private function loader($class_name) { 
    $class_name_plain = strtolower(str_replace("SH_", "", $class_name)); 
    include $class_name_plain . '.php'; 
    $this->$class_name_plain = new $class_name; 
} 

Mais Je reçois l'erreur suivante appelant $core-template comme ceci:

require 'includes/classes/core.php'; 
$core = new SH_Core(); 

if (isset($_GET['p']) && !empty($_GET['p'])) { 
    $core->template->loadPage($_GET['p']); 
} else { 
    $core->template->loadPage(FRONTPAGE); 
} 

L'erreur:

Notice: Undefined property: SH_Core::$template in /home/fabian/domains/fabianpas.nl/public_html/framework/index.php on line 8
Fatal error: Call to a member function loadPage() on a non-object in /home/fabian/domains/fabianpas.nl/public_html/framework/index.php on line 8

Il charge automatiquement les classes, mais juste ne lance pas l'objet, car en utilisant le code suivant cela fonctionne sans problème:

public function __construct() { 
    $autoloader = new classAutoloader(); 

    $this->database = new SH_Database(); 
    $this->template = new SH_Template(); 
    $this->session = new SH_Session(); 
} 
+0

Cette fonction vous obtenez une erreur ne figure pas dans le code que vous nous avez donné. Afin d'aider avec l'erreur nous avons besoin du code provoquant l'erreur. –

+0

Votre erreur et votre prose renvoient à des choses non représentées dans le code donné. Fournissez un _testcase_. –

Répondre

8

Avez-vous essayé:

$this->$class_name_plain = new $class_name(); 

à la place?

0

Je l'ai résolu en utilisant:

private function createObjects() { 
    $handle = opendir('./includes/classes/'); 
    if ($handle) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       $object_name = str_replace(".php", "", $file); 
       if ($object_name != "core") { 
        $class_name = "SH_" . ucfirst($object_name); 
        $this->$object_name = new $class_name(); 
       } 
      } 
     } 
     closedir($handle); 
    } 
} 
Questions connexes