- Подключение файлов
- Зачем разделять и подключать PHP-сценарии
- Способы подключения файлов — require и require_once
- Примеры подключения файлов
- Абсолютные и относительные пути
- Видимость переменных в подключаемых сценариях
- Различие между абсолютными и относительными путями. В файловой системе и на сайте.
- PHP Текущее местоположение скрипта, папки, имя файла
- Как в PHP узнать полный путь к файлу или папке
Подключение файлов
Способность вызывать сценарий из отдельного файла по его имени называется в PHP подключением файлов. Подключают PHP-сценарии, любые текстовые файлы или HTML-страницы.
Зачем разделять и подключать PHP-сценарии
PHP-разработчики дробят исходный код проекта на отдельные сценарии, чтобы было проще работать. Если написать код в одном файле, сценарий станет необъятным, и ориентироваться будет невозможно.
Если вынести повторяющиеся блоки кода в отдельные сценарии, то появится возможность повторно использовать один код в разных файлах и подключать его только по требованию.
Например, пользовательские функции удобно объявлять в отдельном сценарии, а затем подключать там, где эти функции понадобились.
Способы подключения файлов — require и require_once
Для подключения файлов в PHP есть две языковые конструкции: require и require_once . Отличия между ними минимальны. Оба этих ключевых слова подключают файл с указанным именем и вызывают ошибку, если данный файл не существует.
👉 Особенность работы require_once — он позволяет подключать файл только один раз, даже если вызывать инструкцию несколько раз с одним именем файла.
Примеры подключения файлов
Рассмотрим, как подключить один сценарий внутри другого. Для этого воспользуемся инструкцией require . Предположим, у нас есть два сценария: index.php и sub.php .
В файле index.php находится код, который подключит сценарий sub.php :
Интересный факт: require можно использовать как ключевое слово, либо как функцию.
Результат будет одним и тем же:
Результат работы:
Привет, я содержимое из sub.php! А я - index.php!
Что произошло? Два сценария как бы склеились в один: выполнилось все содержимое sub.php и добавилось в начало сценария index.php .
О работе с функцией require подробно рассказано в этом задании.
Абсолютные и относительные пути
При подключении файла в качестве его адреса указывают абсолютный или относительный путь.
Абсолютный путь — это полный адрес файла от корня диска. Например, /var/www/web/site/inc/sub.php
Относительный путь содержит адрес относительно текущей рабочей директории. Если сценарий лежит в папке /var/www/web/site , то для подключения файла используется такой путь: inc/sub.php
Рекомендуется всегда указывать относительные пути, чтобы сайт продолжал работать, если его переместят в другую папку.
👉 В PHP есть полезные встроенные константы, их используют в пути к подключаемым файлам.
__DIR__ — полный путь к директории с текущим сценарием.
__FILE__ — полный путь к текущему сценарию.
Видимость переменных в подключаемых сценариях
При подключении файлы склеиваются в один, поэтому и все переменные в разных сценариях тоже получают общую область видимости.
В PHP нет системы модулей, как в других языках программирования (Python, Java, ECMAScript 12). Невозможно «импортировать» отдельные переменные или функции из подключаемого сценария.
Если подключить один сценарий дважды, то переменные и функции из него тоже объявятся повторно, а это вызовет ошибку. Чтобы такого не произошло, используйте require_once .
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Различие между абсолютными и относительными путями. В файловой системе и на сайте.
твой сайт существует в как бы в двух измерениях.
Реальном и виртуальном.
Для всех посетителей — это виртуальный веб-сервер. Который отличается, в числе прочего, тем, что на нем НЕ СУЩЕСТВУЕТ ФАЙЛОВ. если ты пишешь http://site.ru/file.html — это не файл. Это URI, виртуальный адрес. Никакого файла с именем file.html на сервере может вообще не быть. Это все виртуальные адреса, а не файлы.
И браузер работает именно с адресами.
Для разработчика же сайт — это программа, выполняющаяся на совершенно конкретном реальном компьютере. С совершенно конкретным жестким диском, каталогами и файлами. И скрипт, работая со своими данными, подгружая другие скрипты, работает именно с реальными ФАЙЛАМИ, на физическом ДИСКЕ.
Вот в этом различии и кроются трудности, с которыми часто сталкиваются новички.
Теряют файлы, путают ссылки с файлами, обращаются к локальным файлам по протоколу HTTP, или инклюдят файлы от корня веб-сервера.
А всего-то надо четко понимать две вещи:
1. Различать корень веб-сервера, как его видит браузер, и корень файловой системы на диске.
2. Отличие относительных путей от абсолютных.
Начнем со второго.
Это очень просто. Если путь указывается от корня системы, то это путь абсолютный. Это как почтовый адрес в реальной жизни — откуда бы ты не шел, но по точному адресу ты всегда точно найдешь нужное место.
примеры абсолютных путей:
/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com
В юникс-системах и на веб сайтах корень обозначается косой чертой — «/».
Это важно. Это не просто палочка, а самостоятельный АДРЕС, путь.
В адресе http://www.site.ru/ последняя косая черта — не для красоты! Она обозначает вполне конкретный адрес — начало сайта.
На диске в юникс системах так же можно набрать «cd /» и ты попадешь в корневой каталог.
В виндоус системах файловая система разбивается по дискам, поэтому, в абсолютном адресе надо указывать имя диска. Абсолютного корня всей файловой системы в виндоус нет, у каждого диска — свой. Например, C:\ E:\
поэтому, даже если путь в виндоус начинается с косой черты, то это не абсолютный путь, а относительный. Относительно текущего диска. А абсолютный начинается с буквы.
Если в начале пути корень не указать, то этот путь будет относительным, и он достаивается от текущего положения. В реальной жизни это напоминает дорогу к винному магазину — «два квартала налево и там все время прямо». Дойти по такому пути можно только из конкретной точки. Из другой ты попадешь уже в совсем другое место.
Самый простой пример относительного пути — это просто имя файла.
Если файл находится в том же каталоге, с которым работает программа — она его найдет, добавив текущий путь к имени файла.
примеры относительных путей:
file.php (фал лежит в той же папке)
./file.php (фал лежит в той же папке. такая запись иногда требуется в некоторых юникс системах)
images/picture.jpg (файл лежит в капке images, которая находится в текущей)
../file.php (файл лежит в папке, которая расположена на один уровень выше от текущей)
../../file.php (файл лежит в папке, которая расположена на два уровня выше от текущей)
И операционная система, и браузер, встретив относительный путь, достраивают его до абсолютного. но каждый — по-своему.
Теперь перейдём к первому пункту.
Различие корня веб-сервера, как его видит браузер, и корень файловой системы на диске.
В общем-то, из предыдущих объяснений уже все должно быть понятно.
На диске путь к файлу скрипта может быть таким:
/var/www/site/forum/index.php
В то же время, виртуальный адрес этого скрипта при просмотре через браузер, будет:
http://www.site.ru/forum/index.php
На этом примере легко увидеть, где пересекаются два измерения: у этих двух адресов есть общая часть — /forum/index.php — и она-то и служит причиной путаницы.
Для браузера это самый полный путь, который только может быть. Он начинается от корня сайта.
Для скрипта же, исполняющегося на сервере — это всего лишь ЧАСТЬ пути.
для скрипта путь /forum/index.php окажется несуществующим — в корне диска нет каталога forum!
чтобы получить полный путь для того, что на сайте выглядит, как /forum/index.php , надо приставить слева к нему путь к папке, которая считается корневаой для всего веб сервера.
в нашем примере — это
/var/www/site
Этот путь задается в кофигурации веб-сервера и именно он содержится в системной переменной PHP $_SERVER[‘DOCUMENT_ROOT’]
В виртуальном же сервере — том, который видит пользователь — наоборот, нет никакого диска. Есть корень сайта. То есть, для того, чтобы любая ссылка гарантированно работала, независимо от того, из какого места сайта она вызывается, она должна быть абсолютной.
Если у вас на сайте есть, допустим, два раздела:
http://www.site.ru/about/info.php
и
http://www.site.ru/job/vacancy.php
то, если в файле info.php сделать ссылку просто на vacancy.php , то браузер ее не найдет — он будет искать адрес http://www.site.ru/about/vacancy.php , достраивая путь от текущего каталога.
Поэтому надо писать полный путь от корня сайта — /job/vacancy.php
Всё это касается, естественно, не только тегов но и и любых других, где используются ссылки на другие файлы.
Ссылки на локальные адреса следует писать без указания протокола и домена — только путь от корня сайта — /job/vacancy.php . Ссылки же на другие сайты следует писать полностью — http://www.site1.ru/job/vacancy.php .
PHP предоставляет множество средств для работы с файлами, каталогами и URL-ами.
Во-первых, это многочисленные предопределённые переменные, которые описаны в документации и значения которых в своём скрипте можно посмотреть с помощью команды phpinfo() :
Константа __FILE__ содержит имя текущего исполняемого файла.
В отличие от PHP_SELF она содержит имя файла, исполяющегося в данный момент.
очень полезной представляется конструкция dirname(__FILE__) , на которую желательно заменить все вызовы файлов, лежащих в том же каталоге, что и вызывающий скрипт. Например:
require dirname(__FILE__).»/init.php»
функция dirname() , наряду с basename() является одними из наиболее употребительных для работы с файлами и каталогами.
Примечание:
При проблемах с путями при переносе скриптов с виндоус на юникс систему, в первую очередь обращайте внимание на регистр букв. На юникс-серверах регистр букв в имени файла имеет значение, File.txt и file.txt — это два разных файла, а под виндоус — один и тот же. Лучше всего писать имя файла всегда точно, соблюдая регистр.
PHP Текущее местоположение скрипта, папки, имя файла
В языке PHP есть несколько полезных констант, которые мы можем применять в построении динамического пути к файлу или папке.
Как в PHP узнать полный путь к файлу или папке
Для начала приведу примеры, что вы получите вызвав соответствующие константы:
echo __FILE__; // /home/bitrix/www/bitrix/modules/main/admin/php_command_line.php echo __DIR__; // /home/bitrix/www/bitrix/modules/main/admin
Мы рассмотрели 2 константы, __FILE__ и __DIR__ для отображения полного пути к текущему файлу и папке (директории). Стоит отметить, что __DIR__ эквивалентен вызову:
echo dirname(__FILE__); // /home/bitrix/www/bitrix/modules/main/admin
dirname – это стандартная функция PHP, которая возвращает родительский каталог. Она применяется как раз для таких ситуаций, когда вам нужно узнать полный путь к файлу без самого файла :). Мне на ум пришла идея, как можно добиться такого же результата (не удивлюсь, если под капотом тоже самое):
echo str_replace(__FILE__, '',__DIR__); // /home/bitrix/www/bitrix/modules/main/admin
Что мы еще можем применить для константы __FILE__? Конечно же отделить путь и получить просто имя файла:
echo basename(__FILE__); // php_command_line.php
basename – функция возвращает последний элемент из пути, который, как правило, и является именем файла. Раз уж мы решили писать функции заменители, давайте рассмотрим наш URL, как массив, разделенный слешами (“/”):
$arPath = explode('/', __FILE__); // Array ( [0] => [1] => home [2] => bitrix [3] => www [4] => bitrix // [5] => modules [6] => main [7] => admin [8] => php_command_line.php
Как видим, последний элемент массива является нашим файлом. Чтобы получить последний элемент массива, не зная его количество, пишем:
$arPath = explode('/', __FILE__); echo $arPath[count($arPath)-1];
Минус 1 потому как отсчет для массивов идет с нуля, но при счете всегда стартует с единицы.
Важно – в некоторых указаниях полного пути вы используете разделители (вышеупомянутые слеши ‘/’). Но, для Windows это «\», для Linux и остальных — «/». Есть такая константа:
Вернет 1 слеш (без кавычек).
Немного закрепим 2 функции, о которых шла речь выше:
str_replace – функция, которая используется для замены в строке. Первый параметр “что ищем”, затем “на что меняем” и последний “где ищем”, в который мы и передали нашу полную строку.
explode – функция, которая делает из строки массив. Но, чтобы функции понять как разбить строку – ей нужно передать “разделитель”, а уже вторым параметром – саму строку.
Как вы заметили, “/home/bitrix/www” – это путь на самом сервере, который можно “вырезать” как раз при помощи str_replace.
Если вам нужно использовать “текущий домен”, то получить его при помощи PHP можно несколькими способами. Один из них:
echo $_SERVER['SERVER_NAME']; // site.com.ua
Надеюсь вам эта тема была интересна. Пишите в комментариях как вам формат, и нужен ли он вообще. А то в последнее время только битрикс да битрикс :).