Вопрос

Какое решение вы бы порекомендовали для включения файлов в PHP-проект?

  1. Нет ручных вызовов функций require / include - все загружается через функции автозапуска
  2. Импорт пакетов, когда это необходимо.

Вот API для импорта пакетов:

import('util.html.HTMLParser');
import('template.arras.*'); 

В этом объявлении функции вы можете разбить строку на точки (разделитель иерархии пакетов), просматривая файлы в конкретном пакете (папке), чтобы включить только один из них или все из них, если символ звездочки находится в конце строки, например('template.arras.*').

Одно из преимуществ, которое я вижу в методе импорта пакетов, заключается в том, что он может заставить вас использовать лучшую декомпозицию объектов и группировку классов.

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

Что вы думаете по этому поводу?

  • Какие преимущества / недостатки вы можете назвать в каждом из этих методов?
  • Как я могу найти наилучшее решение для проекта?
  • Как я могу узнать, возникнут ли какие-либо проблемы с производительностью при использовании управления пакетами?
Это было полезно?

Решение

Я широко использую __автозагрузку().Функция autload, которую мы используем в нашем приложении, имеет несколько настроек для обеспечения обратной совместимости со старыми классами, но обычно мы следуем соглашению при создании новых классов, которые позволяют autoload() работать довольно незаметно:

  • Согласованное Именование класса:каждый класс находится в своем собственном файле, каждый класс имеет имя в верблюжьем регистре, разделенное символом подчеркивания.Это соответствует пути к классу.Например, Some_CoolClass сопоставляется с нашим каталогом классов, затем 'Some/CoolClass.class.php '.Я думаю, что некоторые фреймворки используют это соглашение.
  • Явно требовать внешних классов:поскольку у нас нет контроля над именованием каких-либо внешних библиотек, которые мы используем, мы загружаем их с помощью функции require_once() PHP.

Другие советы

Метод импорта является улучшением, но по-прежнему загружает больше, чем необходимо.
Либо используя звездочку, либо загружая их в начале скрипта (поскольку импорт перед каждым "новым именем класса" станет громоздким)

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

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

Я использую require_once("../path-to-auto-load-script.php.inc") с автоматической загрузкой

У меня есть стандартное соглашение об именовании для всех классов и inc-файлов, которое упрощает программное определение того, какое имя класса запрашивается в данный момент.

например, все классы имеют определенное расширение, например inc.php
(итак, я знаю, что они будут в каталоге / cls)
и
все файлы inc начинаются с .ht (поэтому они будут находиться в каталоге /inc)

автоматическая загрузка принимает один параметр:className, которое я затем использую, чтобы определить, где на самом деле находится файл.повторяю цикл, как только я узнаю, каков мой целевой каталог, каждый раз добавляя ".. /" для учета вложенных страниц (что, казалось, нарушало автоматическую загрузку для меня) и, наконец, require_once'ing фактический файл кода после его нахождения.

Я настоятельно рекомендую вместо этого сделать следующее:

Поместите все ваши классы в статический массив, имя_класса => путь к файлу/classFile.Функция автоматической загрузки может использовать это для загрузки классов.

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

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

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

Я не являюсь поклонником __autoload().Во многих библиотеках (например, в некоторых библиотеках PEAR) разработчики используют class_exists() без передачи относительно нового второго параметра.Любой существующий у вас устаревший код также может иметь эту проблему.Это может вызвать предупреждения и ошибки, если у вас есть __autoload() определенный.

Однако, если ваши библиотеки понятны и вам не нужно иметь дело с устаревшим кодом, это фантастический инструмент.Иногда я жалею, что PHP не был немного умнее в том, как они управляли поведением class_exists(), потому что я думаю , что проблема заключается в этой функциональности , а не __autoload().

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top