PHP include и require
Чтобы сделать программный код более удобочитаемым, вы можете к примеру поместить определения функций и/или классов в отдельный файл. Возможность подключения файлов в PHP обеспечивают четыре языковые инструкции:
include
require
include_once
require_once
Все четыре инструкции могут принимать в качестве параметра имя локального файла. Инструкция include
и require
очень схожи по действию и отличаются лишь реакцией на невозможность получения запрошенного ресурса. Например, в случае недоступности ресурса include
и include_once
выводят предупреждение и пытаются продолжить исполнение программы. require
и require_once
при недоступности запрошенного ресурса останавливают обработку данной страницы.
include
Инструкция include позволяет подключать и присоединять к вашему PHP-сценарию другие сценарии. При запуске программы интерпретатор просто заменит инструкцию на содержимое подключаемого файла. Давайте посмотрим как это работает, создайте файл с именем add.php
и напишите внутри:
<?php $var1 = 'красный'; $var2 = 'яблоко'; ?>
Теперь создадим другой файл и назовем его к примеру test.php
, в котором мы подключим файл add.php
:
<?php // предполагается, что файл add.php находится в той же директории, // что и сам сценарий, поэтому мы не указываем путь к файлу include 'add.php'; echo "\$var1 = $var1<br> \$var2 = $var2" ?>
Как видно из примера инструкция include
присоединяет содержимое подключаемого файла, благодаря этому ваша программа получает доступ к другим переменным, функциям, классам и т.д.
Примечание: вы можете присваивать подключаемым файлам любые имена, но всегда добавляйте расширение .php
, потому что при использовании другого расширения, злоумышленники могут запросить ваш файл, и веб-сервер вернет его текст. Это угроза безопасности, поскольку могут быть раскрыты пароли или принцип действия вашей программы, что дает лазейку злоумышленникам. Чтобы этого не происходило, подключаемые файлы должны обрабатываться интерпретатором PHP.
Подключение внутри функции
Если подключение файла происходит внутри функции, тогда весь код, содержащийся во включаемом файле, будет вести себя так, как будто он был определен внутри этой функции, т.е. код будет иметь локальную область видимости. Перепишем немного предыдущий пример:
<?php // код внутри файла add.php $var1 = 'красный'; $var2 = 'яблоко'; ?>
Теперь добавим функцию в test.php
:
<?php function foo() { // объявили $var1 глобальной переменной global $var1; include 'add.php'; echo "Внутри функции: $var1 $var2"; } foo(); echo "<br>В глобальной области: $var1"; ?>
Так как внутри функции мы объявили переменную $var1
глобальной, она становится также доступной и в глобальной области видимости.
Путь к файлу
Файлы подключаются исходя из указанного пути к файлу, если путь не указан, будет использоваться путь, который указан в директиве include_path
(в конфигурационном файле php.ini
). Если файл не найден по указанному пути в include_path
, инструкция include
попытается проверить текущую рабочую директорию, в которой находится скрипт подключающий файл, если конструкция include
не сможет найти файл, будет выдано предупреждение (warning
).
Если путь указан - не важно какой: абсолютный или относительный (относительно текущей директории, где расположен включающий сценарий) - директива include_path
будет проигнорирована.
include_once
Поведение include_once идентично инструкции include
, с той лишь разницей, что если код из файла уже был один раз подключен, он не будет подключен и выполнен повторно. Это помогает избежать проблемы с переопределением функций, переменных и т.д. Чтобы лучше понять как это работает приведем пример:
<?php // определим функцию внутри файла add.php function add($x, $y) { return $x + $y; } ?>
В test.php
попытаемся выполнить следующий код:
<?php // подключаем два раза файл add.php include 'add.php'; include 'add.php'; echo add(5, 5); ?>
В результате будет получено сообщение об ошибке, так как функции переопределять нельзя. Чтобы избежать ошибок подобного рода, следует использовать инструкцию include_once
. Перепишем код в файле test.php
:
<?php // подключаем два раза файл add.php include_once 'add.php'; include_once 'add.php'; echo add(5, 5); ?>
require и require_once
Инструкции require и require_once работают идентично include
и include_once
за исключением лишь одной особенности. Если подключаемый файл не будет найден, выполнение скрипта будет остановлено, в то время как include
и include_once
выводят предупреждение и продолжают выполнение скрипта.
Совет: постарайтесь совсем отказаться от использования include
и require
, применяйте их аналоги с суффиксом _once
. Это упростит разбиение большой и сложной программы на относительно независимые модули.