Как использовать spl_autoload() вместо __autoload()

#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% заменяет описанную выше функцию автоматической загрузки ().