2013-07-07 2 views
3

Это мой первый раз, используя автозагрузку, но я получаю ошибку говоря мой класс не может быть найдено:PHP самозарядные классы

Fatal error: Class 'Classes\Sunrise\DB' not found in my\sample\path\.sunrise.app\init.php on line 52 

Edit: Line 52, где я использую статический метод из БД класс. По какой-то причине PHP говорит, что не может найти класс DB.

Моя структура:

order (Folder) 
    + index.php 
.sunrise.app 
    + init.php 
    + ordersetup.php 
    + Classes (Folder) 
     + Sunrise (Folder) 
      + DB.php 

Файл init.php содержит мой автозагрузчика и включен в файл ordersetup.php, который в свою очередь входит в order/index.php с include_once '../.sunrise.app/ordersetup.php'; В файле .sunrise.app/init.php мне нужно использовать класс DB, но я встретил с ошибкой, показанной выше. Что я делаю не так?

Мой автозагрузчик в .sunrise.app/init.php:

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

Мой DB класс в classes/Sunrise/DB.php:

<?php namespace Classes\Sunrise; 

use PDO; 

class DB { ... } 

Edit: Папка Sunrise находится в папке Classes

+0

Вы используете Классы в пространстве имен, но классы в иерархии папок. Является ли это системой Linux? Остерегайтесь правильного корпуса. Используйте require вместо include для запуска фатальной ошибки, если файл не существует. – apartridge

+0

Моя ошибка: папка 'classes' на самом деле' Classes'. Он капитализирован. – enchance

+0

Оператор 'use PDO' вызовет автозагрузчик для класса с именем' PDO' в пространстве имен 'Classes \ Sunrise'. Если вы хотите «PDO» из глобального пространства имен, вам придется писать 'use \ PDO', где ведущее' '' ссылается на глобальное пространство имен –

ответ

1

поскольку сепаратора обеспечивают являются \ вам нужно их заменить с правильным разделителем каталогов для ОС, если это ОС Linux, то они должны быть /

function my_autoload($class_name) { 
    $class_name = str_replace("\\","/",$class_name); 
    require "../.sunrise.app/".$class_name. '.php'; //you have to use path relative to 
                // order or use a absolute path 
                // /var/www/.sunrise.app/ 
} 

Кроме того, если система Linux убедитесь, что в случае классов соответствуют случаю папки, так как Linux является случай чувствительный

+0

Извините, я добавил это автозагрузчику, и это не сработало. Это интересно, если я прокомментирую свой автозагрузчик и использую более старую (скоро развратную) функцию __autoload ($ class_name) {require $ class_name. '.php'; } 'в моем файле' init.php', ошибка исчезает, и моя страница загружается. Но я не хочу использовать его. – enchance

+0

@enchance отлично работает в моей Linux-системе, вы включаете предложение 'if'? если вы устанавливаете его true или false в зависимости от вашей системы? –

+0

Даже с условием 'if' он все равно терпит неудачу. С моей текущей структурой папок, как бы вы, ребята, это сделали? – enchance

Смежные вопросы