Что все имеют в виду под: 'spl:_autoload() является реализацией по умолчанию __autoload()'

Меня смутила одна вещь в автозагрузке 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(). Я просто хочу убедиться, что знаю, как все это работает.

Спасибо.


person DoeJane    schedule 28.04.2018    source источник
comment
Возможный дубликат Что Автозагрузка; Как вы используете spl_autoload, __autoload и spl_autoload_register?   -  person Dipak    schedule 28.04.2018
comment
@Dipakchavda Я видел этот пост   -  person DoeJane    schedule 28.04.2018
comment
Не беспокойтесь о __autoload - эта функция устарела. Используйте spl_autoload_register и используйте собственную функцию автозагрузки   -  person Philipp    schedule 28.04.2018
comment
@Philipp Филипп, такого ответа я не ищу. Я знаю, что это устарело, я просто хочу знать, как это работает.   -  person DoeJane    schedule 28.04.2018


Ответы (1)


Повторяю вопрос, упомянутый ранее: является ли 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.

person Philipp    schedule 28.04.2018