→ Инструкции require и require_once в PHP. Управляющие конструкции Require php описание

Инструкции require и require_once в PHP. Управляющие конструкции Require php описание

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

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

require имя_файла;

При запуске (именно при запуске, а не при исполнении!) программы интерпретатор просто заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP, обрамленный, как обычно, тэгами и ?> ). Причем сделает он это непосредственно перед запуском программы (в отличие от include , который рассматривается ниже). Это бывает довольно удобно для включения в вывод сценария различных шаблонных страниц 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
require "http://www.example.com/file.txt?foo=1&bar=2" ;

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

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

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

?>

Чтобы сделать программный код более удобочитаемым, вы можете к примеру поместить определения функций и/или классов в отдельный файл. Возможность подключения файлов в 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 . Это упростит разбиение большой и сложной программы на относительно независимые модули.

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

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

Конструкция включений 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 имеется 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’;

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

 

 

Это интересно: