Подключение в PHP сторонних файлов
Очень часто бывает необходимость разбить одну большую программу на несколько файлов. Также бывает такое, что необходимо подключить скрипт другого разработчика к своей программе. И вот как раз о подключении в PHP сторонних файлов я и расскажу в этой статье.
Давайте для начала создадим файл "a.php", в котором напишем такие строки:
<?php
echo "Это работа скрипта в файле a.php";
?>
Теперь давайте создадим ещё один файл (например, "b.php") и подключим в нём скрипт "a.php":
<?php
require "a.php";
echo "Это работа скрипта в файле b.php";
?>
Как Вы догадались, подключение стороннего файла в PHP осуществляется с помощью конструкции require. Если выражаться простым языком, то эта конструкция просто копирует весь код из "a.php" и вставляет в "b.php". Очень важный нюанс: путь к файлу должен быть написан верно, причём старайтесь писать относительный путь, а не абсолютный, так как написание абсолютных путей в конструкции require часто отключено в настройках PHP, в целях безопасности. Также Вы можете подключать не только PHP-файлы, но и любые другие. Например, часто подключаются HTML-файлы. В своё время, когда я делал один сайт, я чтобы не копировать определённые повторяющиеся вещи (например, меню, счётчики, копирайты и прочее), я запихнул их HTML-код в отдельный файл. А потом на каждой странице просто подключал эти файлы. В результате, чтобы внести изменение, например, в меню, мне достаточно было исправить один подключаемый файл, и сразу после этого весь сайт преображался. Так что эта конструкция крайне полезна, и, как минимум, экономит тучу времени.
Однако, очень важный момент. Как избежать такой проблемы: допустим два разработчика делают одну большую программу. Первый разработчик нашёл готовый вариант выполнения части своей задачи, и подключил его с помощью require. Второй разработчик так же нашёл абсолютно то же самое готовое решение для уже своей задачи, и так же с помощью require подключил скрипт. Затем когда оба разработчика соединят свои части в единое целое, появятся ошибки. Почему? А всё потому, что они один и тот же скрипт подключили два раза. Давайте посмотрим на простой пример:
<?php
require "a.php";
require "b.php";
echo "Это работа скрипта в файле c.php";
?>
Если Вы запустите данный скрипт, то обнаружите, что файл "a.php" подключался два раза, однако, мы же вызывали его всего один раз. Почему так вышло? А потому, что в файле "b.php" он также подключается. Вот такая проблема получается. И решается она очень просто: с помощью конструкции require_once. Она делает всё тоже самое, но если файл уже был подключен в этом скрипте, то подключать его не будет. Давайте исправим файл "b.php":
<?php
require_once "a.php";
echo "Это работа скрипта в файле b.php";
?>
Теперь, если мы запустим скрипт "c.php", то увидим, что файл "a.php" запустился как и положено всего один раз. Лично я Вам советую всегда использовать конструкцию require_once, если конечно Вам не нужно вставлять одно и то же по несколько раз (такое тоже иногда бывает нужно). Таким образом, Вы избежите лишних ошибок.
И, напоследок, хочется рассказать ещё о двух похожих конструкциях, с помощью которых тоже можно подключить в PHP сторонние файлы - это include и include_once. Они полностью аналогичны выше рассмотренным, но есть одно небольшое отличие. В случае конструкций require и require_once, если подключаемый файл не будет обнаружен, то выполнение скрипта прервётся. А при использовании include или include_once просто выведется предупреждение, и скрипт продолжит выполняться. Вот и вся разница. Советую даже проверить и убедиться уже в этом самостоятельно.
-
- Михаил Русаков
Комментарии (44):
а как быть, если при вызове require_once 'file.php' выдает: Failed opening required 'file.php' (include_path='.:/usr/local/pear')?
Ответить
В этом случае надо указывать полный физический путь через использование $_SERVER['DOCUMENT_ROOT'];
Ответить
Спасибо, получилось. Я уже и с set_include_path намучился, ругал хостера... А оказалось просто буквы в имени файла перепутал...)
Ответить
А почему вы не затрагиваете проблемы безопасности? Вы рассказываете о всяких функциях и новички не понимая общей картины могут убить сайт. К примеру есть уязвимость которая называется PHP injection. Если написать: require($_GET['page']); это может привести к инъекции. Например если запущен скрипт index.php?page=home.php, то запуск скрипта с в таком виде index.php?page=index.php может вызвать бесконечную рекурсию. А в худшем случае можно заразить сайт вредоносным кодом. Пример сайта уязвимого к рекурсии http://www.bbcasaformica.com/index.php?page=index.php
Ответить
а все же что лучше использовать require_once или include_once?
Ответить
Разницу посмотрите в статье, поэтому всё зависит от ситуации, но обычно лучше использовать require_once.
Ответить
вашу статью и другие статьи я то читал, но вот почему то не могу уловить это решающее преимущество. Насколько я понял, обычные блоки в виде хэдера, футера и еже с ними все таки лучше подключать с помощью include. его же лучше использовать при наличии циклов. Меня больше интересует ситуация, когда необходимо подключить конфигурационный файл, содержащий соединение с БД. я подключаю его с помощью простого include. Что может трагичного случиться, если вдруг окажется, что это файл дважды был подключен к странице и, соответственно, дважды имело место соединение с БД? Я вчера специально проводил следующий экперимент. В мною разрабатываемом проекте есть формы создания объявлений. Соответственно, они начинаются с выбора региона, а также рубрик и разделов объявлений. В зависимости от выбранной рубрики с использованием jquery, ajax и php подключаются соответствующие файлы, например, продажа домов, покупка авто, содержащие формы, индивидуальные для этих рубрик. ситуация такая:выбрал рубрику-появилась соотвествующая форма объявлений. Если понескольку раз перевыбирать рубрики, то с течением времени повляются "тормоза". Так вот, если использовать require_once, то они появляются чуть раньше, чем при include_once или include. С чем то может быть связано?
Ответить
Видимо, Вы не понимаете разницу. Напишите разницу между include_once и require_once.
Ответить
include подключает страницу, когда до него доходит сценарий, а require сразу же, поэтому, как я понял, его в циклах лучше не использовать, так как (об этом пишут в статьях) подключение будет в независимости от условий цикла.once проверяет, был ли файл подключен ранее, и есла да, то игнорирует повторную команду
Ответить
я не прав?
Ответить
Абсолютно нет, даже близко и вообще не в ту степь. Читайте ещё раз данную статью.
Ответить
Вы имеете в виду реакцию на ошибку?
Ответить
Вы напишите разницу, а когда её осознаете, то поймёте, насколько абсурдны Ваши утверждения про цикл и прочее.
Ответить
Я так понимаю, помочь осознать это Вы не желаете?
Ответить
Всё написано в статье, написать проще я не могу.
Ответить
в ней можно было просто вставить вместо require include и начинающий программист, как я,так и не понял бы принципиальной разницы, кроме той, что require_once прерывает работу скрипта, а include_once нет. Я же обратился к вам с просьбой о разъяснении....
Ответить
А других отличий и нет и никогда не было. Поэтому все эти циклы, какие-то рекомендации - всё это бред. include не прерывает, а require прерывает, всё больше ничего нет.
Ответить
Это я и подозревал. Почему то для меня всегда важно мнение
Ответить
Михаил, в своей статье Вы пишите, что, верстая один сайт, запихнули HTML код в отдельный файл, а потом вставляли в нужное место с помощью конструкций require и include. А на сайте myrusakov.ru разве не таким способом подключаются повторяющиеся блоки? И если не таким, то как Вы подключаете повторяющийся контент?
Ответить
Да, таким.
Ответить
А можно вопрос не совсем по теме? Можно ли шаблон для джумлы переделать под шаблон для сайта с нуля? Я пытался но уменя всё сразу ломается!!!???
Ответить
Переделать можно, но на это уйдет много времени, так как придется разбираться с css.
Ответить
Спасибо! А можете сказать в каком файле изначально надо искать?
Ответить
Зависит от конкретного шаблона.
Ответить
Ок...А вы мне скажете где искать если вам дам ссылку на шаблон? Очень прошу!!! Я просто первый раз начал заниматься ЦМС и хочется первым делом разобраться в строении шаблона Помогите плииз... http://www.1joomla.ru/ice-themes/322-it-sporty-2.html
Ответить
Вот и будет для Вас хорошей практикой. Начните с css, посмотрите через firebug почему элементы отображаются не так, как надо.
Ответить
Михаил, у меня при присоеденении файла перед текстом и вообще кодом выводятся символы:"п»ї". в чем может быть проблема и как ее решить?
Ответить
Используйте кодировку UTF-8 без BOM.
Ответить
Михаил, а можно по подробней? пожалуйста
Ответить
http://myrusakov.ru/html-change-encoding.html
Ответить
Здравствуйте Михаил. В данной статье вы подключали a.php к b.php. А можно ли сделать наоборот - в конце a.php подключить b.php?
Ответить
Можно.
Ответить
Очень напоминает подключение css
Ответить
Михаил вы не подскажете как реализовать подключение PHP файла с другого сервера. Задача состоит в том что нужно подключить файл с сервера, и передать ему данные для записи в БД. Я пытался сделать так (require_once "http://launcher-ogc.zz.mu/podcl.php";)Но думаю это не правильно. Программа пишется на DevelStudio 3.0 Буду признателен если откликнитесь и поможете советом.
Ответить
Такое сделать нельзя, это, как минимум, небезопасно. Чтобы передать данные другому скрипту, надо отправлять туда запрос, либо GET, либо POST.
Ответить
Спасибо
Ответить
Михаил, почему не работает функция include? Вот рабочий пример: <?php include 'helloworld.php'; ?> А вот этот почему-то не рабочий <?php include '../helloworld.php'; ?> Разумеется перемещаю файл helloworld.php в директорию на 1 выше той, в которой находится основной файл. Скажите где ошибка?
Ответить
Александр, здравствуйте, проблема скорее всего в том, что неверное размещаете, т.к код написан правильно.
Ответить
Пути правильные. Я проблему решил: на самом деле код написан не совсем правильно. вот как нужно было написать и всё заработало: <?php include '/../helloworld.php'; ?>
Ответить
Вопрос по теме include. Прошу помощи. Ситуация такая. У меня есть страничка-шаблон которая собирается из других файлов(top.php footer.php) с помощью include("имя_файла.php"). все это лежит в корне сайта. а файлы top.php и footer.php содержат навигацию и другие ссылки внутри себя вида "images/имя_файла". проблемы начались когда я создал папку articles и разместил там множество статей на основе моего файла-шаблона. все ссылки перестали работать. т.к. они уже не из корня сайта исходят а из папки. как быть?как это делается по правильному.
Ответить
как сделать так чтобы основные составные части сайта лежали в корне, а другие странички, которые из них собираются, размещались в разных папках(articles,doctors,clinics). у кого есть опыт.подскажите.
Ответить
А безопасно ли подключать библиотеку со стороннего сайта, например для записи в бд? То есть библиотека с функциями лежит на сайте lol.ru, а вы ее подключаете на сайте sajt.ru, после используете ее методы для работы с бд.
Ответить
ответ дан на форуме. Пожалуйста,не дублируйте сообщения.Всё равно быстрее ответ дан не будет
Ответить
Думал тут уже не читают:)
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.