#php #function #xampp #autoload
Вопрос:
Согласно http://php.net/manual/en/language.oop5.autoload.php функция magic __autoload()
была устаревшей с PHP 7.2.0 и удалена с PHP 8.0.0.
Официальная альтернатива такова spl_autoload()
. Видишь http://www.php.net/manual/en/function.spl-autoload.php. Но руководство по PHP не объясняет, как правильно использовать этого ребенка.
Мой вопрос: Как заменить это (мой автоматический загрузчик классов) версией с spl_autoload()
?
function __autoload($class) {
include 'classes/' . $class . '.class.php';
}
Проблема: я не могу понять, как указать этой функции путь (она принимает только пространства имен).
Кстати, здесь, на SO, есть много тем, касающихся этой темы, но ни одна из них не дает чистого и простого решения, которое заменило бы мой сексуальный однострочный.
Комментарии:
1. Я добавил базовый пример, основанный на приведенном выше примере, в документацию по PHP. Надеюсь, в будущем такие вещи будет не так сложно найти.
2. Руководство по PHP совсем не отстой.
3. @Shikiryu Ну, честно говоря, так оно и есть. В большинстве случаев нелегко понять, как что-то работает, потому что документы были написаны полными закоренелыми ботаниками. Даже когда вы знаете, как что-то работает, невозможно понять официальные документы. Что еще хуже, в большинстве случаев официальные документы исправлены (!) и переписаны чертовски большим количеством комментариев. Такие вещи, как mysqli, файлы cookie или сеансы, очень трудно найти и гораздо труднее понять. Когда вы сделаете это, как в примерах, вы потерпите неудачу. Это общая проблема в ИТ и с открытым исходным кодом: отсутствие удобства использования.
4. Я был абсолютно честен. Док кажется мне ясным. Например, для этого конкретного вопроса выбранный ответ был полностью написан в разделе «Совет» на странице, которую вы указали… Но сейчас я только что видел, как ты спрашивал почти год назад, так что, возможно, все изменилось.
Ответ №1:
Вам необходимо зарегистрировать функции автоматической загрузки с spl_autoload_register
помощью . Вам нужно предоставить «вызываемый». Самый лучший способ сделать это, начиная с 5.3 и далее, — использовать анонимную функцию:
spl_autoload_register(function($class) {
include 'classes/' . $class . '.class.php';
});
Основное преимущество этого метода, __autoload
конечно, заключается в том, что вы можете вызывать spl_autoload_register
несколько раз, в то __autoload
время как (как и любая функция) может быть определена только один раз. Если у вас модульный код, это будет существенным недостатком.
обновление 2018 года к этому: на самом деле не должно быть так много случаев, когда вам нужно запустить свой собственный загрузчик. Существует широко принятый стандарт (называемый PSR-4) и несколько соответствующих реализаций. Очевидный способ сделать это-использовать Composer.
Комментарии:
1. Также стоит упомянуть, что, вероятно, было бы неплохо сделать вашу автоматическую загрузку PSR-0 , что в значительной степени является стандартом (в дополнение к устаревшей поддержке старых соглашений PEAR). Если вы пишете свой собственный загрузчик, это делает его довольно совместимым с тем, что делают некоторые более крупные и популярные фреймворки. Если вы не хотите писать свой собственный, но используете указанные соглашения об именовании/хранении, вы можете использовать существующий компонент автозагрузчика.
2. @lonesomeday Спасибо, это идеальное решение, которое на 100% заменяет описанную выше функцию автоматической загрузки ().