Подтвердить что ты не робот

__autoload против семьи

Сегодня я обнаружил функцию __ autoload, и после прочтения официальной страницы руководства этой функции есть точка, в которой я вообще не получаю.

Какая разница между использованием __autoload() и допустим require_once?

поскольку он выглядит как autoload, новый способ сделать требуемый включает , но мне гораздо лучше использовать require_once. Следовательно, __autoload должен быть определен во всех php файлах, что означает запись его кода там, если я помещаю ВСЕ my includes/require_once/... и т.д. В один файл, позвоните ему main_header.php, тогда все, что мне нужно сделать в моих файлах веб-приложений, - написать одну строку кода:

<?php require_once('main_header.php');  ?> 

Я где-то ошибаюсь?

4b9b3361

Ответ 1

Я могу увидеть две вещи для автозагрузки (не обязательно __autoload; предпочитают более современные spl_autoload_register):

  • Вам не нужно явно включать классы. Конечно, вы можете сделать main_header.php, как в вашем примере, но затем следующий элемент вступает в силу.
  • Вам не нужно загружать 100 классов, если вы собираетесь использовать только 10 из них.

Также стоит отметить, что автозагрузка также запускается при повторной инициализации объекта класса, который еще не определен, что делает вещи бесконечно более практичными. Конечно, есть еще один крючок в unserialize для этого (настройка конфигурации unserialize_callback_func), поэтому автозагрузка технически не нужна. Это определенно лучше, хотя.

Ответ 2

Сначала: используйте spl_autoload_register() вместо __autoload().

Вызывается автозагрузчик при попытке доступа к классу, который не существует. С помощью include() вы просто включаете класс. Основное различие заключается в том, что с использованием автозагрузчика класс включается только в том случае, если его действительно требуется/используется.

Обычно вы определяете автозагрузчик в одном файле и включаете его в каждый запрос. Если вы используете загрузку (это означает: один файл, который улавливает каждый запрос и перенаправляет его на соответствующую цель), он необходим только для определения автозагрузчика. Поэтому его не требуется определять в каждом файле.

Ответ 3

Автозагрузчик используется для ленивой инициализации. Он наиболее эффективен с архитектурой MVC, а не с веб-сайтами, которые содержат файл здесь и там, и определяют строку подключения db в каждом файле (что ужасно).

Использование автозагрузки с инфраструктурой MVC позволяет экономить ресурсы и привносит много модульности. Поскольку вам не нужно включать файлы с классами, вы просто создаете экземпляр класса, который вам нужен, в контроллере, в котором вы сейчас находитесь.

В принципе, это вещь ООП. Вы не должны беспокоиться об этом, если вы не используете объектный подход для структурирования вашего веб-сайта и включаете/требуете, что будет работать для вас.

Ответ 4

Выберите правильный инструмент для задания. Автозагрузка предназначена для загрузки исходного кода еще undefined Классы перед использованием. Таким образом, вы можете создавать экземпляры, на которых пока не нужны файлы.

Это имеет смысл, если вы работаете с классами и хотите, чтобы файлы находились в центральном месте, вместо этого в разных файлах использовалась одна точка.

Но если вы используете входящие и требуете, чтобы сказать, что создайте веб-сайт с меню и нижним колонтитулом, это не имеет смысла. Autoload не работает для этого:

<html>
  <head><title>Reciepes collection - My Homepage</title></head>
  <body>
<?php include('header.html'); ?>
<h1>My Reciepes collection</h1>
<p>Cooking is one of my favorite hobbies .... (</p>....)
<?php include('footer.html'); ?>
  </body>
</html>

Если вы хотите использовать функции загрузки, вы также не можете использовать автозагрузку.

Таким образом, только потому, что автозагрузка выглядит несколько странным для вас, это не значит, что она соответствует вашим потребностям.

Я лично использую его в проектах, где я не хочу заботиться о требованиях к классам и где я хочу иметь возможность динамически загружать классы из модульного каталога и структуры библиотеки.

Я могу использовать spl_autoload_register() для регистрации одной или нескольких реализаций автозагрузки. Это рекомендуемый метод регистрации функции автозагрузки в PHP, поскольку он позволяет иметь несколько автозагрузчиков.

Ответ 5

Я думаю, что это сводится к личным предпочтениям. Для меня автозагрузка - типичный тип php - грязный "волшебный кавычек", похожий на хак, который существует только потому, что они не утруждают себя сидением и кодируют чистое решение проблемы - в этом случае адекватное система упаковки + захватывающее исключение ClassNotFound. Пока мы не зафиксируем это, я буду придерживаться include.

Ответ 6

Все ответы более чем правильные и адекватные. Я просто подумал, что должен добавить свои два цента.

Во-первых, функции * _once медленны. Не используйте их.

Во-вторых, в приложении, которое я разрабатываю, у меня много классов, на которые я полагаюсь друг на друга, и я не всегда знаю, какие классы необходимы на странице.

Вместо создания страницы main.php и включая все классы, которые много; очевидно, тратить ресурсы и время (включить и потребовать дорого), я использую autoload для включения этих файлов по мере необходимости на странице. Все, что я делаю, это код, и классы добавляются автоматически.

Это также улучшает структуру вашего кода и каталогов, поскольку вы следуете за системой при именовании своих классов и файлов.

Просто добавление. С точки зрения использования ресурсов и скорости (уменьшение порядка требований и увеличения порядка скорости):

Require_once(); include_once(); require(); включают в себя()

Создание включает в себя лучшие и самые быстрые.

Ответ 7

Автозагрузка и включенные семейные функции имеют свое место.

Autoload предназначен для ленивой загрузки модулей в OO на основе script (а именно, классов и интерфейсов) и вызывается, когда вы используете новый или статически вызываете метод класса, который еще не загружен. Это вызывает автозагрузку для запуска функции, которая пытается загрузить (обычно через include) класс или интерфейс. Преимущество такого подхода заключается в том, что классы загружаются только тогда, когда они необходимы. Любой класс, который не используется, не загружается.

Автозагрузка не может использоваться для загрузки фрагментов программы, которые не являются классом или интерфейсом, для тех элементов, которые вам все еще нужны для семейства include.

Как добавить функцию автозагрузки для каждого script, которая должна быть загружена автоматически? В этом случае вы добавляете функцию автозагрузки в свой собственный файл и включаете ее в сценарии, которые должны быть загружены автоматически.:)

Ответ 8

Еще одно примечание: включить и потребовать может стать большой болью при модульном тестировании.

Я не знаю, как я должен предотвратить требование/включая что-либо. Существует тестовые помощники, которые могут делать некоторые полезные вещи, такие как предотвращение выхода или вымирания, но они все еще не могут издеваться над включением или требованием.

Mockery библиотека рекомендует использование автозагрузки способный обманывать общедоступные статические методы.