Php оператор require сколько раз выполняется код. Инструкции require и require_once в 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 простым русским языком:
Файл 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);
И та, и другая настройки будут принудительно отображать ошибки
В PHP есть замечательное свойство — подключение файлов, это может быть сторонняя библиотека или просто часть скрипта или верстки. Например, в отдельный файл можно вынести все функции, чтобы упростить чтение кода.
Начнем пожалуй с команд include
и include_once
. В чем же разница. Дело в том, что если вы подключите файл с помощью include
несколько раз, то может возникнуть ошибка, в зависимости от содержимого подключаемого файла. И чтобы избежать повторного подключения используют include_once
. В этом случае повторное подключение файла будет игнорироваться.
Теперь немного практики. Создадим маленький шаблон HTML и разобьем его на части, которые потом скомпонуем. А также создадим файл с функциями и тоже его подключим.
Вот сам сам макет:
Наш тестовый сайт
Создадим 5 файлов: index.php, header.php, content.php, footer.php и functions.php.
Разделим нашу верстку на файлы, копируя и вставляя.
Содержимое header.php:
Содержимое content.php:
Наш тестовый сайт
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Содержимое footer.php:
Как видите, мы просто взяли куски из шаблона и повставляли их в файлы php.
Но теперь нужно скомпоновать их. Для этого открываем файл index.php и подключаем в нем все наши файлы с кусками верстки и пока еще пустой файл с функциями:
Если вы запустите сайт, а именно файл index.php, то увидите, что вся верстка на месте.
Теперь напишем несколько функций в functions.php:
"Название сайта", "title" => "Наш тестовый сайт", "content" => "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", "footer" => "2016г - Все права защищены" ]; return $cont; } //присваиваем переменной массив данных $cont = content(); ?>
Теперь вносим правки в наш код. Header.php:
=$cont["title"];?>
=$cont["content"];?>
=$cont["footer"];?>
Как видите, теперь вся информация хранится в массиве внутри функции, мы ее достаем и публикуем на нашей страничке.
Теперь поговорим о require и require_once. Чем же эта функция отличается от include? Все очень просто. Если include не находит подключаемый файл, то он просто выводит ошибку и продолжает работу скрипта, require же напрочь останавливает его работу. Вот и все.
Просмотры: 1 845
В 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.
А пока что на этом всё. Делайте домашнее задание и до встречи на следующих уроках!