Автозагрузка против Фабрики и Автозагрузка Опасностей - PullRequest
1 голос
/ 04 марта 2011

Это вопрос из двух частей, хотя обе части тесно связаны между собой.

Я создал API декоратора страницы для нашего веб-сайта и поместил автозагрузчик для классов декоратора в наш общедоступный файл. Другой разработчик подумал, что это очень плохая идея, потому что использование вездеходного автозагрузчика очень опасно и может привести к странным ошибкам. Например, сериализация объекта в сеанс и если один из ваших автозагрузанных классов имеет то же имя и __wakeup(), он будет запущен (хотя я пробовал это и не смог воспроизвести его). Правда ли, что автозагрузка опасна, и если да, то какие потенциальные опасности она имеет и как их можно избежать? Я не использую __autoload(), но функцию автозагрузки с spl_autoload_register().

Другой аргумент против использования автозагрузки - это медленнее, чем прямое включение файла, что, вероятно, вполне очевидно. Я утверждал, что для гарантии того, что декоратор будет работать на каждой странице, вам нужно будет включить каждый класс декоратора, поэтому он предложил создать класс фабрики, который получит включение, и создать класс, который вы хотели для вас. Я мог бы продолжать и продолжать, но я слышал, как многие люди рекламируют достоинства автозагрузки и говорят, что это делает любое приложение быстрее. Мне это очень нравится, но я все еще хочу делать то, что лучше и быстрее. Есть предложения?

Ответы [ 2 ]

6 голосов
/ 04 марта 2011

Например, при сериализации объекта в сеансе и если один из ваших автозагрузанных классов имеет такое же имя и __wakeup (), он будет запущен (хотя я пытался это сделать и не смог воспроизвести его).

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

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

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

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

Это большая работа для того, что PHP может сделать изначально.Имейте в виду: если вы используете самостоятельно написанную Фабрику в PHP для определения, какой класс загрузить, вы на самом деле создаете автозагрузчик, но просто не называете его так;)

Есть предложения?

Лично я не хотел бы включать свои файлы вручную.Прошло много времени с тех пор, как я начал использовать функциональность spl_autoload_register, и я не жалею об этом немного.

1 голос
/ 04 марта 2011

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

Хотя я до сих пор не разбирался в пространствах имен PHP, взгляните на большинство основных фреймворков и PEARбиблиотеки используют автозагрузку.

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

т.е. у вас есть класс с именем My_Special_Model.Вызывается автозагрузчик, и он включает файл model.php в мой каталог / special.

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

...