2010-10-29 3 views
0

Вот что загрузчик классов выглядит следующим образом:Возникли проблемы динамической загрузки класса в PHP

loader.php

class Load 
{ 
    public static function init($class) 
    { 
     require_once 'classes/' . $class . '.php'; 
     return new $class(); 
    } 
} 

$class = Load::init('MyClass'); 

Ошибка возвращается в:

Fatal error: Class 'MyClass' not found in /www/website/application/models/Database/loader.php on line 5 

Если я поместите echo 'WORKS'; в MyClass.php, я вижу, что он не включен. То, что echo не выполняется.

UPDATE: Кажется, я редактировал кэшированную версию моего кода, а не фактический файл ... Код работает:}

+0

Ваших классов в/WWW/сайте/приложении/модель/Базе данных/классах /?Если нет, является ли ваш каталог классов в include_path для PHP? – emurano

+0

Да, классы в '/ www/website/application/models/Database/classes /' – dave

+1

Я бы предположил, что 'require_once' вызовет фатальную ошибку, если он не сможет включить файл, поэтому это явно не проблема. – Phil

ответ

2

Попробуйте это.

function __autoload($class_name) { 
    include $class_name . '.php'; 
} 

Укажите, что в любом месте доступно для публики для остальной части вашего кода. В этот момент, когда вы делаете что-то подобное.

$class = new Foobar(); 

Если класс не включен, PHP будет работать эту функцию __autoload и включить файл для вас. Убедитесь, что вы указываете, что включить оператор, где бы ваши классы не были сохранены.

Дополнительную информацию об этом можно найти здесь.

http://php.net/manual/en/language.oop5.autoload.php

+0

Проблема со мной заключается в том, что через несколько недель я вернусь к коду и подумаю: «Где этот класс включен ...: /». Используя 'Load :: init ('MyClass');', я могу видеть, откуда загружаются классы. – dave

+3

Если вы используете Zend Framework, его автозагрузчик должен быть уже зарегистрирован с помощью spl_autoload_register – Phil

+0

charles, убедитесь, что путь к MyClass.php ясен. Похоже, вы говорите, что смотрите в/www/website/application/models/Database/classes. Я просто попробовал этот пример кода, и все получилось хорошо для меня. – castis

0

содержат ли classes/MyClass.php определение класса для MyClass?

Я предполагаю, что require смог найти classes/MyClass.php на пути включения, но загружает ли он правильный файл?

+0

Да, у него есть класс MyClass {} '. Учитывая, что мое «эхо» не выполняется, когда я пытаюсь «require_once» класса, я предполагаю, что он не включен. Однако не возникает ошибки, говоря, что он не смог найти/включить его:/ – dave

+0

Существуют ли какие-либо другие файлы MyClass.php, которые находятся в каталоге 'classes' где-либо еще в вашем проекте или на вашем пути включения? – Phil

+0

Я вижу из вашего обновления, что это действительно так. – Phil

0

Может быть несколько вещей ...

  • Что такое файловая система путь к classes/? Это на вашем пути включения? Если нет, вам нужно использовать абсолютный путь.

  • Если вы на * nix, большинство из них использует файловую систему, чувствительную к регистру - это файл с именем MyClass.php или myclass.php?

+0

Я установил 'require_once' для использования жестко закодированного пути, который является абсолютным системным путем. Файл называется 'MyClass.php'. 'Require_once' не создает ошибку, поэтому он должен включать его ... Я просто не могу получить доступ к его имени:/ – dave

+0

Пространство имен eh? Что такое пространство имен «MyClass»? Вероятно, вы не включаете соответствующий оператор 'use', если класс является пространством имен. – Phil

+0

Если его опечатка в вопросе 'classes/MyClass.php' НЕ является абсолютным путем. Это относительный путь, синонимом './Classes/MyClass.php', где' .' - это путь к вызывающему классу - в этом случае '/ www/website/application/models/Database /'. Абсолютный путь будет выглядеть как '/ classes/MyClass.php'. – prodigitalson

0

Три подсказки:

  1. Вы должны использовать Zend_Autoloader или подкласс одного из автопогрузчиков Зенд, если вы используете Zend Framework. Для использования Zend Autoloader вам необходимо настроить пространство имен автозагрузчиков, например. в application.ini и укажите/поместите файлы в соответствии с соглашением об именах PEAR (Zend).
  2. Вы должны использовать абсолютный путь, поскольку относительные пути могут отличаться и указывать на другие ресурсы, например. APPLICATION_PATH . '/../your/path'
  3. Проверьте права доступа к файлу/собственность
Смежные вопросы