2015-12-21 2 views
0

У меня возникают существенные проблемы с автоматической загрузкой в ​​настоящее время. В настоящее время я использую несколько каталогов, которые сегментируют мое приложение, которое, как я знаю, может быть структурировано более эффективно, однако на данный момент я просто пытаюсь заставить автозагрузчик работать.Проблемы с автозагрузкой [EDIT]

Моя структура каталогов выглядит следующим образом:

HTML

  • классы
    • Config.php
    • db.php
    • register.php
    • reset.php
    • session.php
    • SM_handler.php
    • smtp_handler.php
    • validate.php
  • приложение
    • fb_link.php
    • src
      • Facebook Библиотека
  • библиотека PHPMailer
  • ядро ​​
    • init.php (где мой автозагрузчик)
  • index.php

Ive пробовал разные autloaders включая PSR-0, однако я, кажется, не в состоянии правильно реализовать. Например, я использую:

spl_autoload_register(function ($className) { 
    $className = ltrim($className, '\\'); 
    $fileName = ''; 
    $namespace = ''; 
    if ($lastNsPos = strrpos($className, '\\')) { 
     $namespace = substr($className, 0, $lastNsPos); 
     $className = substr($className, $lastNsPos + 1); 
     $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
    } 
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

    require $fileName; 
}); 

В моем файле index.php, я в том числе autloader:

require_once('/var/www/html/core/init.php'); 

и я добавил пространство имен класса сеанса

namespace classes; 

Я тогда называть класс сессионного

if(!classes\session::exist('ip')){ 

Тем не менее, я продолжаю получать такие же ошибки:

требуется (сеанс.php): не удалось открыть поток: нет такого файла или каталога в /var/www/html/core/init.php в строке 34

Является ли моя структура каталогов неправильной? Или я не правильно использую psr-0? Я придерживаюсь того, что я могу сделать. Благодарю.

EDIT: теперь я могу создать экземпляр файлы в том же каталоге, EG/классы /, однако, когда я называю класс в другом каталоге, вместо того, чтобы искать нужную папку /вар/WWW/HTML/приложение/fb_link .php, он выглядит в /var/www/html/classes/app/fb_link.php, который затем, конечно же, выдает ошибку, поскольку файл не существует. Разве это разрешимо?

+0

У вас есть каталог html в вашем пути включения? Что возвращает get_include_path()? –

+0

Каталог html - это каталог, на котором указывает сайт, поэтому я не думал, что это потребуется? Что касается пространств имен, я не думал, что вам нужно включить root? – Juakali92

+0

В настоящее время я использую автозагрузчик 'AURA'. Он обрабатывает как каталоги PSR-0, так и PSR-4. Я использую бутстрап 'application', который его использует. Я вручную кодировал пути, которые использует автозагрузчик, поэтому я это понимаю. Я также использовал автозагрузчик 'symfony'. Оба отлично работают. [auraphp/Aura.Autoload ] (https://github.com/auraphp/Aura.Autoload) –

ответ

0

Функция автозагрузчика возвращает «classes/session.php» для «classes \ session». Это означает, что «/ var/www/html /» должен быть включен в ваш путь включения. Попробуйте добавить:

set_include_path(implode(PATH_SEPARATOR, array(
    '/var/www/html/', 
    get_include_path(), 
))); 

Или изменить функцию автозагрузчика, чтобы включить полный путь к файлу:

require '/var/www/html/' . $fileName; 

И дайте мне знать, если это помогает.

+0

имя пути действительно имеет значение, и связанные файлы вместе находятся в одном каталоге, однако, когда я ищу классы в другом каталог, он выглядит в классах/приложении, а не просто в приложении. /var/www/html/classes/app/FBlink.php где фактический каталог находится в /var/www/html/app/FBlink.php. – Juakali92

+0

Вы помещали FBlink также в пространство имен классов? Это объясняет эту ошибку. Кроме того, я вижу, что имя класса FBlink не следует за именем файла fb_link.php. Вы не можете извлечь выгоду из автозагрузчика, если ваши имена классов не соответствуют структуре каталогов (с пространством имен или префиксами). Я бы рекомендовал ввести массив карт классов (className => file) и использовать его в вашем автозагрузчике и медленно реорганизовать все классы для использования пространств имен. –

+0

FBlink был в приложении пространства имен; Я могу получить все, чтобы работать, я думаю, но, к сожалению, мне нужно будет пройти через все файлы в facebook и дать им namspaces также со всеми файлами phpmailer. – Juakali92