Операторы include и require. Инструкции require и require_once в PHP

Конструкция включений require

Конструкция require позволяет включать файлы в сценарий PHP исполнения сценария PHP. Общий синтаксис require такой:

require имя_файла;

При запуске (именно при запуске, а не при исполнении!) программы интерпретатор просто заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP, обрамленный, как обычно, тэгами и ?> ). Причем сделает он это непосредственно перед запуском программы (в отличие от , который рассматривается ниже). Это бывает довольно удобно для включения в вывод сценария различных шаблонных страниц HTML-кодом. Приведем пример:

Файл header.html:

It is a title

Файл footer.html:
Home Company, 2005.

Файл script.php
require "header.htm";
// Сценарий выводит само тело документа
require "footer.htm";
?>

Таким образом, конструкция require позволяет собирать сценарии PHP из нескольких отдельных файлов, которые могут быть как html -страницами, так и php -скриптами.

Конструкция require поддерживает включения удаленных файлов (начиная с версии PHP 4.3.0). Например:

// Следующий пример на работает, поскольку пытается включить локальный файл
require "file.php?foo=1&bar=2" ;
// Следующий пример работает
require ;
?>

! Конструкция require позволяет включать удаленные файлы, если такая возможность включена в конфигурационном файле PHP. Подробная информация .

Включения удаленных файлов

PHP позволяет работать с объектами URL, как с обычными файлами. Упаковщики, доступные по умолчанию, служат для работы с удаленными файлами с использованием протокола ftp или http.

Если "URL fopen-оболочки " включены в PHP (как в конфигурации по умолчанию), вы можете специфицировать файл, подключаемый с использованием URL (через HTTP), вместо локального пути. Если целевой сервер интерпретирует целевой файл как PHP-код, переменные могут передаваться в подключаемый файл с использованием URL-строки запроса, как в HTTP GET. Строго говоря, это не то же самое, что подключение файла и наследование им области видимости переменных родительского файла; ведь скрипт работает на удалённом сервере, а результат затем подключается в локальный скрипт.

Для того, чтобы удаленное включение файлов было доступно, необходимо в конфигурационном файле (php.ini) установить allow_url_fopen=1.

Обратите внимание : Версии PHP для Windows до PHP 4.3.0 не поддерживают возможность использования удаленных файлов этой функцией даже в том случае, если опция allow_url_fopen включена.


/* Здесь предполагается, что www.example.com сконфигурирован для разбора.php
* файлов, а не.txt файлов. Также "Works" здесь означает, что переменные
* $foo и $bar доступны в подключённом файле. */

// Не будет работать, так как file.txt не обрабатывается www.example.com как PHP
include "http://www.example.com/file.txt?foo=1&bar=2" ;

// Не будет работать, поскольку ищет файл "file.php?foo=1&bar=2" в локальной
// файловой системе.
include "file.php?foo=1&bar=2" ;

// Следующий пример работает:
include "http://www.example.com/file.php?foo=1&bar=2" ;

$ foo = 1 ;
$ bar = 2 ;
include "file.txt" ; // Работает
include "file.php" ; // Работает

?>

Операторы PHP: require(), require_once(), include_once()

Дата: 2012-10-15

Функции PHP: require(), require_once(), include(), include_once()

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

include_once()
require()
require_once()

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

include("file.php") или require("file.php")

Задача у всех этих функций одна и та же: вставить нужный код или текст из одного файла в другой файл. Но, все-таки, эти функции отличаются между собой. Давайте разбираться чем.

Суффикс "_once " позволяет подключить код файла для подстановки в другой файл только один раз, сколько бы вызовов не осуществлялось. Для наглядности давайте разберем простой пример. В прошлом уроке мы разобрались, что с помощью оператора include() , можно вынести шапку сайта в отдельный файл header.php , для простоты будем считать, что в этот файл мы выносим графический логотип сайта. В нужном месте web-страницы (в данном случае на месте шапки сайта) прописываем код Листинга 1 .

Листинг 1.

То соответственно и логотип сайта тоже выведется два раза, примерно вот таким образом:

Согласитесь, смотрится не очень красиво, правда? Получается, что оператор include() два раза вытаскивает из папки blocks файл header.php и два раза подставляется его на место шапки сайта.

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

На больших сайтах очень легко запутаться, где и какой файл Вы включали и можно ли включить его повторно, а это может привести к ошибке. Поэтому придумали приставку "_once " к функциям include и require , которая включает содержание файла в другую web-страницу только один раз .

Чем функция include() отличается от require()

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

Давайте вернемся к предыдущему примеру код Листинга 1 . У нас есть следующий код:

Include ("blocks/header.php");

Давайте попробуем удалить файл header.php , который мы собственно и подключаем, например файл поврежден или случайно был удален с севера.

Обновляем тестовый файл и видим вот такую ошибку:

Как Вы видите, появилось сообщение о том, что в директории (папке) blocks не найден файл header.php , но программа дальше все равно выполняется и остальная часть web-страницы сайта отображается нормально.

А если мы напишем код (Листинг 3 ) используя функцию require() :

Листинга 3 .

Require ("blocks/header.php");

То у нас будет выведено только одно сообщение об ошибке , и программа дальше выполняться не будет , и Вы увидете только вот такое сообщение.

Как вы знаете, в PHP имеется 4 функции для подключения других файлов. Это include , include_once , require и require_once . Чем же они различаются и как правильно их использовать?

Для начала разберём разницу между include и require . Эти две функции различаются только реакцией на отсутствие подключаемого файла. Функция include («включить») при отсутствии указанного файла выдаст сообщение об ошибке типа E_WARNING, но выполнение программы продолжится. В отличие от неё, require («требовать») при отсутствии подключаемого файла выдаёт фатальную ошибку (E_ERROR), которая приводит к немедленной остановке выполняемого скрипта.

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

Теперь рассмотрим конструкции include_once и require_once . От простых include и require они отличаются окончанием «_once», которое предотвращает повторное подключение тех же самых файлов.

Скажем, если в вашем подключаемом файле есть описания классов или функций, то такой файл подключать повторно нельзя, поскольку он будет исполнен заново и PHP выдаст фатальную ошибку при попытке определить классы или функции с уже существующими именами. Нет сомнений, что можно построить код таким образом, чтобы повторное подключение никогда не происходило, но это лишние ограничения и лишняя работа. Поэтому функции с суффиксом «_once» полезны и нужны.

В своей практике я использую два вида файлов. Первый вид — это файлы, содержащие один или несколько классов и не содержащие кода, исполняемого «напрямую». Такие файлы всегда подключаю с помощью require_once . Второй вид — это шаблоны или куски шаблонов, содержащие HTML и немного PHP-кода. Такие файлы подключаю с помощью require , поскольку иногда один и тот же кусок шаблона может быть использован на странице несколько раз.

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

Существует ещё одна фишка при использовании include. Несмотря на то, что на самом деле это не функция, а языковая конструкция, внутри подключаемого файла работает оператор return . И, стало быть, include возвращает это значение вызываемому коду. Это выглядит вот так

$ret = include ‘file.php’;

На сегодня это всё, программируйте правильно!

Одна из самых занимательных и полезных возможностей php - подключение другого файла. Например, на сайте есть верхнее меню, нижнее и между ними само содержание страницы. И, например, на 10 страницах сайта используется нижнее меню. В какой-то момент в него потребовалось внести изменения. В html Вы бы вручную в каждом отдельном файле вносили изменения, но php позволяет существенно упростить работу с сайтом! Код нижнего меню может содержаться в отдельном файле, а на каждой из 10-ти страниц можно просто подключать этот отдельный файл! То есть все изменения нужно теперь вносить только в файл с меню, а на 10-ти других оно будет отображаться уже с изменениями.

Смысл подключения в php простым русским языком:

Файл 1.php
Верхнее меню

Файл 2.php
Нижнее меню

Файл example.php
Подкючаем Файл 1.php
Содержание страницы
Подкючаем Файл 2.php

В результате проработки файла example.php будет отображено
Верхнее меню
Содержание страницы
Нижнее меню
Соответственно, чтобы что-либо изменить в нижнем меню, нужно внести изменения только в файле 2.php

Путь к файлу

Подключение файла происходит согласно указанному к файлу пути. Есть два варианта пути: относительный и абсолютный. Относительный - это указание пути к подлючаемому файлу относительно файла с инструкцией подключения. Абсолютный - указание полного пути к подключаемому файла.

Код PHP

// пример относительного пути
include "include/ваш_файл.php"; // файл лежит в папке include, которая находится в той же директории, что и файл с подключением

// пример абсолютного пути
include $_SERVER["DOCUMENT_ROOT"]."/include/ваш_файл.php"; // $_SERVER["DOCUMENT_ROOT"] - указывает корневую директорию сайта

include и include_once

include() - конструкция, предназначенная для включения файлов в код сценария PHP во время исполнения сценария PHP. При обработке кода инструкция заменяется на содержимое присоединяемого файла. Предлагаю сразу рассмотреть пример.

Рассмотрим работу include на примере двух файлов: index.php и text.php . Для простоты работы допустим, что они лежат в одной директории.

Код PHP (файл index.php )

Echo "Обычный текст, содержащийся в основном файле";
include "text.php"; // подключаем содержимое файла text.php

?>
Код PHP (файл text.php )

Echo "Текст, содержащийся в подключаемом файле";

?>
В результате работы файла index.php отобразится:

Обычный текст, содержащийся в основном файле
Текст, содержащийся в подключаемом файле
Правда удобно? Теперь, поменяв содержимое в файле text.php будет совершенно другой результат работы index.php!

Теперь поговорим о другой конструкции - include_once . Она работает абсолютно также как и include, только создана позже и для тех случаев, когда нельзя повторно подключить файл. Например, Вы боитесь, что в результате ошибки можете подключить файл 2 и более раз, что скажется на некорректной работе страницы и получении соответствующего сообщения об ошибке.

Код PHP

Include_once "text.php"; // файл text.php будет подключен только один раз

// повторное подключения ниже не будет учтено и отображено
// и из-за него не будет выведено сообщение об ошибке
include_once "text.php"; // ничего не произойдёт

require и require_once

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

Если не работает include или require

Чтобы понять причины того, почему не работает include, предлагаю проверить всё по шагам. Какими бы понятными и поверхностными не были указанные ниже пункты, проверьте всё с самого начала

1. Проверьте, работает ли Ваш сервер и php, работает ли вообще любой php код на сайте
2. Убедитесь, существует ли файл подключаемый файл
3. Проверьте, правильно ли введено название файла и расширение в подключении
4. Убедитесь, что подключаемый php-файл действительно находится по тому адресу, по которому указали
5. Попробуйте указать не относительный путь, а абсолютный (полный путь к файлу).

Пример Код PHP

Include "http://www.example.com/include/ваш_файл.php";

// DOCUMENT_ROOT - обозначает корневую директорию ресурса
include $_SERVER["DOCUMENT_ROOT"]."/include/ваш_файл.php";

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

Php_flag display_errors On
или в файле php , перед подключением, вставьте следующую строку

Error_reporting(E_ALL);
И та, и другая настройки будут принудительно отображать ошибки

Макеты страниц

13.22. Оператор require()

Принцип работы оператора require() подобен директиве препроцессора #include() в языке программирования C++. Если вы знакомы с этим языком, то освоить следующие операторы для вас не составит никакого труда, впрочем, даже если вы и не знакомы, мы постараемся более подробно описать принципы работы данных операторов. Оператор require() заменяет, вызывает содержимое файлов, путь и имя которого были указаны в блоке оператора:

require("path/filename.html");

Если параметры URL fopen_wrapper_SB PHP установлены как enabled (допустимо) (как правило, они - default (недостаточная), то вы можете также производить определение файла в операторе require(), используя URL (Uniform Resource Locator - унифицированный указатель ресурса) вместо того, чтобы использовать локальный путь к необходимому файлу в операторе require(). Например:

$url = http://my_new_adress/index.phtml;

Оператор require() не является функцией. Скорее всего его можно назвать конструкцией языка. Почему мы не можем считать этот оператор функцией:

Require() не подчинен к каким-либо управляющим структурам;

Require() не возвращает какое-либо значение, что в свою очередь делает функция.

Попытка вызова какого-либо значения из оператора require() приведет к ошибке и прерыванию дальнейшего выполнения программы.

В отличие от include require всегда производит чтение строки адреса файла, даже в том случае, когда он не выполняется. Если вам необходимо условно включить файл, используйте оператор include(). Просто условные выражения не считаются эффективными при работе с оператором require Однако если строка, на которой расположен оператор requre не будет выполнена, то тогда не будет выполнена ни одна строка кода в файле по этому адресу. Это логично, так как именно доступ к файлу в данном случае и осуществляется через оператор require().

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

Следовательно/вы не можете помещать оператор require() со всеми прилагающимися к нему инструкциями в блок оператора цикла и ожидать при работе того самого цикла различного выполнения данного оператора на каждой итерации. Чтобы воспользоваться этим, предлагаем вам применить оператор include().

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

В том случае, если оператор require() работает с файлом, который вызван через HTTP и использует fopen wrappers, и если адрес станции интерпретирует конечный файл как PHP-код, то в этом случае переменные могут быть переданы в оператор require(), используя URL-запрос, как метод HTTP Get. Это не то же самое. что вызов файла оператора require так как скрипт практически продолжает выполнение сценария на удаленном сервере и результаты будут потом включены в локальный сценарий:

/* не будет работать, так как не был обработан сервером*/

require("http://my_domain_name/file.txt?varone=1&vartwo=2");

/* не работать, так как имя файла "file.php?varone=1&vartwo=2"

ориентировано на локальную файловую систему */

require("file.php?varone=1&vartwo=2");

/* будет работать без ошибок */

require("http://my_domain_name/test.php?varone=1Svartwo=2");

require("file.txt");

require("file.php");

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



 

Возможно, будет полезно почитать: