Класс автозагрузчика PHP

Я реализую класс автозагрузчика, и он не работает. Ниже приведен класс автозагрузчика (вдохновленный этой страницей на php.net):

class System
{
    public static $loader;

    public static function init()
    {
        if (self::$loader == NULL)
        {
            self::$loader = new self();
        }

        return self::$loader;
    }

    public function __construct()
    {
        spl_autoload_register(array($this, "autoload"));
    }

    public function autoload($_class)
    {
        set_include_path(__DIR__ . "/");
        spl_autoload_extensions(".class.php");
        spl_autoload($_class);
print get_include_path() . "<br>\n";
print spl_autoload_extensions() . "<br>\n";
print $_class . "<br>\n";
    }
}

Код, который вызывает автозагрузчик, находится здесь:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

require_once __DIR__ . "/system/System.class.php";

System::init();

$var = new MyClass(); // line 9

print_r($var);
?>

И сообщения об ошибках:

/home/scott/www/system/
.class.php
MyClass
Fatal error: Class 'MyClass' not found in /home/scott/www/index.php on line 9

Удаляется функция автозагрузки, файл MyClass.class.php существует в пути включения, который я могу проверить, изменив код следующим образом:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

require_once __DIR__ . "/system/System.class.php";
require_once __DIR__ . "/system/MyClass.class.php";

System::init();

$var = new MyClass();

print_r($var);
?>

print_r($var); возвращает объект и без ошибок.

Любой совет или указатели?

1 ответ

Решение

Как указано на странице документации для spl_autoload, имя класса в нижнем регистре перед поиском файла класса.

Итак, решение 1 состоит в том, чтобы прописать мой файл в нижнем регистре, что не является для меня приемлемым ответом. У меня есть класс с именем MyClass, я хочу поместить его в файл с именем MyClass.class.php, а не в myclass.class.php.

Решение 2 состоит в том, чтобы вообще не использовать spl_autoload:

<?php
class System
{
    public static $loader;

    public static function init()
    {
        if (self::$loader == NULL)
        {
            self::$loader = new self();
        }

        return self::$loader;
    }

    public function __construct()
    {
        spl_autoload_register(array($this, "autoload"));
    }

    public function autoload($_class)
    {
        require_once __DIR__ . "/" . $_class . ".class.php";
    }
}
?>
Другие вопросы по тегам