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