Импорт пакета или автозагрузка для PHP? - PullRequest
4 голосов
/ 05 марта 2009

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

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

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

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

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

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

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

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

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

Ответы [ 6 ]

4 голосов
/ 05 марта 2009

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

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

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

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

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

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

1 голос
/ 05 марта 2009

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

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

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

0 голосов
/ 06 марта 2009

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

0 голосов
/ 05 марта 2009

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

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

0 голосов
/ 05 марта 2009

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

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

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

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

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

...