Я использую следующий класс для автозагрузки всех моих классов. Этот класс расширяет основной класс.
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'; } }
Я создаю экземпляр этого класса в __construct()
моего основного класса:
public function __construct() { $autoloader = new classAutoloader(); }
Теперь я хочу иметь возможность создавать объекты класса loader следующим образом:
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; }
Но я получаю следующую ошибку, вызывающую $core-template
следующим образом:
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); }
-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); }
-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); }
Ошибка:
Примечание. Неопределенное свойство: SH_Core :: $ template в /home/fabian/domains/fabianpas.nl/public_html/framework/index.php в строке 8
Неустранимая ошибка: вызовите функцию-член loadPage () для не-объекта в /home/fabian/domains/fabianpas.nl/public_html/framework/index.php в строке 8
Он автоматически загружает классы, но просто не запускает объект, потому что, используя следующий код, он работает без проблем:
public function __construct() { $autoloader = new classAutoloader(); $this->database = new SH_Database(); $this->template = new SH_Template(); $this->session = new SH_Session(); }
Ты пробовал:
$this->$class_name_plain = new $class_name();
вместо?
Я решил это, используя:
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); } }