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

Большинство страниц сайта имеют общие элементы, такие как header, footer и меню навигации. Можно изменить внешний вид этих элементов по всему сайту, изменив правила стиля во внешней стилевой таблице. Но CSS имеет лишь ограниченные возможности для изменения содержимого элементов страницы. Если вы хотите добавить новый пункт меню, вам необходимо отредактировать HTML на каждой странице, которая его отображает. Средства веб разработки, такие как Dreamweaver и Expression Web, имеют системы шаблонов, которые автоматически обновляют все страницы, подключенные к главному файлу, но вам все еще нужно будет загружать файлы на удаленный сервер.

Это не обязательно, если PHP поддерживает серверные включения (SSI). Серверное включение (server-side include) является внешним файлом, содержащим динамический код или HTML (или и то и другое), который необходимо включить в несколько страниц. В PHP содержимое встраивается в каждую веб-страницу на сервере. Поскольку каждая страница использует один и тот же внешний файл, можно обновить меню или другие общие элементы путем редактирования и загрузки одного файла, что существенно экономит время.

Команды включения файлов в PHP

В PHP существует четыре команды, которые могут быть использованы для включения кода из внешнего файла, а именно:

  • include();
  • include_once();
  • require();
  • require_once();

Все они делают в основном одно и то же, так почему их четыре?

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

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

Так какую же из команд использовать? Я рекомендую использовать include() для внешних файлов, которые не являются критически важными, и require_once() для файлов, которые содержат определения функций и классов.

Где PHP ищет включаемые файлы?

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


include('includes/menu.inc.php');
include('C:/xampp/htdocs/phpsols/includes/menu.inc.php');
include('/Applications/MAMP/htdocs/phpsols/includes/menu.inc.php');

PHP принимает символы косой черты в путях к файлам в операционной системе Windows.

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


include 'includes/menu.inc.php';
include 'C:/xampp/htdocs/phpsols/includes/menu.inc.php';
include '/Applications/MAMP/htdocs/phpsols/includes/menu.inc.php';

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

 include('./includes/menu.inc.php'); // путь начинается в текущей папке 

Использование пути к файлу относительно корня сайта не работает, как в следующем примере:

 include('/includes/menu.inc.php'); // РАБОТАТЬ НЕ БУДЕТ 

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

Выбор правильного расширения имени файла для включений

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

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

С другой стороны, любой файл с расширением .php расширение автоматически отправляется к интерпретатору PHP для парсинга (разбора), перед тем как будет отправлен в браузер. Итак, пока ваша секретная информация находится внутри блока кода PHP и в файле с расширением .php, она не будет раскрыта. Поэтому многие разработчики используют .inc.php как двойное расширение для включений PHP. Расширение .inc напоминает вам, что это включаемый файл, но только серверы интересует только .php на конце, которое гарантирует, что весь код PHP правильно обработан.

Поскольку обычной практикой является хранение включаемых файлов в отдельной папке, которую часто называют includes, вы можете утверждать, что .inc.php является излишним. Какие соглашения об именования вы выбирете решать вам, но использовать только .inc менее безопасно.