Статьи

PHP включения

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

Языковые конструкции

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

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

include_once — это вариант конструкции include, которая позволяет избежать многократного включения одного и того же скрипта.

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

Все эти операторы являются конструкциями языка PHP, поэтому вам не нужно строго указывать скобки () при их вызове:

include_once 'bootstrap.php';

функции

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

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

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

include_path

Include_path представляет собой набор каталогов , обычно используемые для включения файлов: пути , переданных ранее описанных конструкций и функций будут рассматриваться по отношению к этим каталогам. Каталоги будут проверяться по порядку, пока не будет найден включаемый файл. include_path используется всякий раз, когда путь является относительным и без явных ссылок на ./ или ../; например, всякий раз, когда определен абсолютный путь, он включается полностью без дальнейшего разрешения.

include_path является основной директивой файла конфигурации php.ini, хотя вы можете установить его во время выполнения с помощью функций ini_get () и ini_set ().

Формат этой строки эквивалентен переменной среды $ PATH с разделителем, который изменяется в зависимости от операционной системы ( : для систем Unix и ; для систем Windows).

include_path используется для разрешения автоматически включают и требуют конструкций, а также для их _ один раз версий. Его также можно активировать, установив для логического второго аргумента значение TRUE при использовании readfile () и file_get_contents ().

Как это использовать

Вы можете установить include_path глобально для всех ваших приложений:

include_path=.:/usr/share/php   ;where PEAR classes are kept

Или, если вы предъявляете к ним различные требования, установите его в коде пользовательского пространства. Вы можете поместить этот скрипт начальной загрузки в папку, которую вы хотите установить в вашем include_path, и включить его через относительный путь:

define('APPLICATION_PATH', realpath(dirname(__FILE__)));

set_include_path(implode(PATH_SEPARATOR, array(
APPLICATION_PATH,
get_include_path()
)));

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

Автозагрузка

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

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

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

Стандартная реализация включена в SPL, а современные библиотеки PHP используют или переходят на автозагрузку. Вот пример кода для автозагрузки классов без пространства имен (который сопоставляет My_Package_Class с My / Package / Class.php).

function myAutoload($class)
{
if (strstr($class, '_')) {
$classFile = str_replace('_', '/', $class) . '.php';
include_once $classFile;
if (!(class_exists($class) or interface_exists($class))) {
throw new \Exception("Namespaced class $class not found (included file: $classFile.");
}
return true;
}
return false;
}
spl_autoload_register('myAutoload'); // also a method of an object can be used, every valid callback

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

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