загрузчик классов — PHP не может автоматически загружать классы

Мы привыкли включать только классы, которые хранятся в {project_root}/includes папка. И мы использовали функцию автозагрузки для включения классов, которые нам нужны, в наши приложения. Теперь я хотел использовать библиотеку и столкнулся с проблемой:

1) Автозагрузка:

// {project_root}/includes/autoLoad.php
// There is a global_connfig.php file that loads by directive in php.ini
// auto_prepend_file = /var/www/global_config.php which includes autoload.php file and sets the include path to {project_root}/includes
function __autoload($classname){
include "$classname.php";
}

2) Код, который я хотел использовать:

//just an example from the monolog reference
// I put Monolog folder with it's subfolders in {project_root}/includes
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger("name");
$log->pushHandler(new StreamHandler(LOGSPATH . '/monolog', Logger::WARNING));$log->warning('Foo');
$log->error('Bar');

3) Ошибки:

Warning: include(Monolog\Logger.php): failed to open stream: No such file or
directory in {project_root}/includes/autoLoad.php

Я пытался использовать что-то вроде этого: автозагрузка классов в подпапках, но все еще получаю
Class 'Monolog\Logger' not found

вопрос обновлен

2

Решение

Попробуйте использовать эту функцию автозагрузки:

function __autoload($classname)
{
$filename = str_replace("\\", "/", $classname).".php";
include __DIR__."/$filename";
}
  • Заменяет \ с / чтобы соответствовать пути
  • Он ищет из includes/ каталог.

Вы также можете рассмотреть возможность добавления includes/ путь к вашему include_path директива php:

set_include_path(get_include_path() . PATH_SEPARATOR . "{project_root}/includes");
1

Другие решения

Других решений пока нет …