Что все подразумевают под: «spl: _autoload () является реализацией по умолчанию __autoload ()» - PullRequest
0 голосов
/ 28 апреля 2018

Я запутался с одной вещью в автозагрузке php: функцией spl_autoload(). В каждом ответе я обнаружил, что эта функция является реализацией по умолчанию __autoload. Разве PHP не должен определять реализацию по умолчанию __autoload() сам по себе, а затем, если я явно создаю __autoload(), он просто переопределит ее?

Если я не определю функцию __autoload() в моем php-файле, будет ли реализация по умолчанию? spl_autoload() это какая-то внутренняя функция, если да, то почему она в php doc?

(Если это не внутренняя функция) В каждом примере spl_autoload () нет вызова этой функции, только spl_autoload_register без параметров, spl_autoload_extensions и т. Д. почему так? Чего мне не хватает?

Цитата из: Что такое автозагрузка; Как вы используете spl_autoload, __autoload и spl_autoload_register?

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

Поскольку spl_autoload является реализацией по умолчанию __autoload () магический метод, PHP будет вызывать spl_autoload, когда вы попытаетесь создать экземпляр новый класс.

Так что, если я не буду звонить spl_autoload_register(), он не зарегистрирует реализацию по умолчанию? spl_autoload проверяет расширения, установленные spl_autoload_extensions();, а затем импортирует все файлы с этими расширениями из пути включения? Повторяющийся вопрос, упомянутый ранее: spl_autoload() является внутренней функцией?

Я знаю, что __autoload() устарела, и я должен использовать spl_autoload_register(). Я просто хочу убедиться, что знаю, как все это работает.

Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018

Повторяющийся вопрос, упомянутый ранее: spl_autoload() внутренняя функция?

Это просто «значение по умолчанию» для spl_autoload_register, если вы не передаете параметр. Вы также можете вызвать эту функцию автономно, если хотите. Поведение spl_autoload может быть настроено с spl_autoload_extensions и set_include_path.

Внутренне spl_autoload принимает полное имя класса (fqcn) в качестве пути для поиска реализации класса. (Может быть с заменой строк для разделителей каталогов). После этого он выполняет поиск в каждом элементе class_include_path после указанного файла.

spl_autoload_extensions(".php");
spl_autoload_register();
$foo = new \foo\Bar();
// now spl_autoload tries to load the file foo/Bar.php inside your class path.

Если вам нужно что-то более сложное, вы должны создать свой собственный обратный вызов для автозагрузчика. То есть как то так

spl_autoload_register(function($class) {
    $path = 'classes' . DIRECTORY_SEPERATOR;
    // dont care about case
    $class = strtolower($class);
    // replace _ with DIRECTORY_SEPERATOR
    $name = str_replace('_', DIRECTORY_SEPERATOR, $class);
    // don't care about windows/unix
    $name = str_replace('/', DIRECTORY_SEPERATOR, $name);
    $file = $path . $name . '.php';
    if (file_exists($file)) {
        include ($file);
    }
});

Примечание. Приведенный выше пример не заботится о значении spl_autoload_extensions или set_include_path.

...