- Как правильно прописать путь к файлу через require_once?
- Подключение файлов
- Зачем разделять и подключать PHP-сценарии
- Способы подключения файлов — require и require_once
- Примеры подключения файлов
- Абсолютные и относительные пути
- Видимость переменных в подключаемых сценариях
- Базовые возможности PHP
- Инструкция include
- Инструкция include_once
- Инструкции require и require_once
- Функция spl_autoload_register
Как правильно прописать путь к файлу через require_once?
Я так пишу: require_once __DIR__ .»\\footer.php»;
Полный путь: d:\OpenServer\domains\bk\views\footer.php
Как добавить файл d:\OpenServer\domains\bk\components\database.php
И как правильно это делать, ведь при переносе на сервер пути придется менять.
Backslash (обратная косая) \ в путях к файлам используется, в основном, в виндовс. На линуксе это не прокатит. К счастью винда почти везде понимает и обычный слеш, так что можно писать
d:/penServer/domains/bk/views/footer.php . Если хотите быть увереным в том, что путь будет правильным на любой платформе, используйте DIRECTORY_SEPARATOR .
Вы можете указывать пути или относительно текущего файла ( __DIR__ ), как у вас в примере, или относительно корня сайта ( $_SERVER[‘DOCUMENT_ROOT’] ), или относительно какой-то папки, путь к которой вынесен в конфиг.
А классы так подключать — вообще моветон. Почитайте про автолоадеры, например.
Примеры применения:
1. Допустим, сейчас исполняется файл D:/OpenServer/dummysite/index.php
И мы хотим подключить файл D:/OpenServer/dummysite/templates/footer.php
Тогда можно написать так: require __DIR__ . ‘/templates/footer.php’
1. Допустим, сейчас исполняется файл D:/OpenServer/dummysite/admin/index.php
И мы хотим подключить файл D:/OpenServer/dummysite/templates/footer.php
Тогда путь из первого примера будет ссылаться на D:/OpenServer/dummysite/admin/templates/footer.php
Чтобы это исправить, придется писать require __DIR__ . ‘/../templates/footer.php’
Или
require $_SERVER['DOCUMENT_ROOT'] . '/templates/footer.php'
require $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'footer.php'
require_once __DIR__ .’../components/DataBase.php’;
у меня выдает такую ошибку:
Fatal error: require_once(): Failed opening required ‘D:\OpenServer\domains\bk\views../components/DataBase.php’ (include_path=’.;d:/openserver/modules/php/PHP-7.1-x64;d:/openserver/modules/php/PHP-7.1-x64/PEAR/pear’) in D:\OpenServer\domains\bk\views\view.php on line 6
khodos_dmitry: Сорри, ща подправлю. Вот эти две точечки должны в итоге оказаться между слешами.
Типа так:
D:/myfolder/../zzz.txt
Подключение файлов
Способность вызывать сценарий из отдельного файла по его имени называется в 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 .
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Базовые возможности PHP
При разработке программ на PHP, возможно, какую-ту часть кода мы захотим использовать одновременно в других файлах с кодом PHP. В этом случае отдельные части кода можно распределить по отдельным файлам. Это позволить не писать один и тот же код по сто раз на сотнях скриптов, а будет достаточно подключить файл с кодом PHP. Кроме того, если потребуется изменить поведение подключаемого кода, достаточно будет изменить код в подключаемом файле.
Для подключения файлов PHP предоставляет ряд возможностей.
Инструкция include
Инструкция include подключает в программу внешний файл с кодом php. Так, для примера определим файл welcome.php :
Здесь определена функция welcome , которая в качестве параметра принимает условное имя и использут его для вывода приветствия.
Теперь подключим данный файл в нашу программу, которая определена в другом файле в той же папке:
В место определения инструкции include будет вставляться весь код из файла welcome.php . При этом вставка файла должна происходить до использования функции, определенной в этом файле. При этом в данном случае файл welcome.php и файл, в который он подключается, располагаются в одной папке.
Конструкция include может использовать как относительные, так и абсолютные пути. Например, выше использовался относительный путь. Или, к примеру, если мы имеем следующую структуру
То чтобы подключить файл welcome.php из папки scripts , в файле index.php необходимо использовать следующий относительный путь:
include "scripts/welcome.php";
Если файл welcome.php располагается по полному пути C:\localhost\scripts\welcome.php , то также можно было бы использовать абсолютный — полный путь:
include "C:\localhost\scripts\welcome.php";
Инструкция include_once
Использование инструкции include имеет недостатки. Так, мы можем в разных местах кода неумышленно подключить один и тот же файл, что при выполнении кода вызовет ошибки.
Чтобы исключить повторное подключение файла, вместо инструкции include следует применять инструкцию include_once
И теперь, если мы подключим этот же файл с помощью include_once еще где-нибудь ниже, то это подключение будет проигнорировано, так как файл уже подключен в программу.
Инструкции require и require_once
Действие инструкции require подобно инструкции include: она также подключает внешний файл, вставляя в программу его содержимое. Только теперь, если данный файл не будет найден, действие программы прекратится (инструкция include в этом случае выбрасывает предупреждение):
И также если у нас в коде встретятся несколько инструкций require , которые подключают один и тот же файл, то интерпретатор выдаст ошибку. И также чтобы избежать данной ситуации, следует использовать инструкцию require_once :
Функция spl_autoload_register
В больших приложениях количество подключаемых файлов может быть довольно большим. Однако встроенная функция spl_autoload_register() в определенных ситуациях позволяет избежать большого количества инклудов. В качестве параметра она принимает функцию автозагрузки. Эта функция автоматически вызывается, когда в программе начинает использоваться неизвестный класс или интерфейс. И функция автозагруки пытается загрузить этот класс или интерфейс. В качестве параметра функция автозагрузки принимает название класса или интерфейса, которые надо загрузить.
Например, пусть у нас будет файл Person.php , в котором располагается класс Person :
name = $name; $this->age = $age; > function printInfo() < echo "Name: $this->name
Age: $this->age"; > > ?>
Обращаю внимание, что название файла соответствует названию класса.
Используем функцию автозагрузки для подключения подобного класса:
"; include $class . ".php"; > spl_autoload_register("my_autoloader"); $tom = new Person("Tom", 25); $tom->printInfo(); ?>
Функция spl_autoload_register() в качестве параметра принимает название функции автозагрузки — в данном случае это функция my_autoloader() . В качестве параметра она принимает название класса. Например, в данном случае используется класс Person, который в этом скрипте не определен. И когда программа встретит использование данного класса, она вызовет функцию my_autoloader() , в качестве параметра $class передаст в нее название класса Person.
Все действия функции автозагрузки мы определяем сами. В данном случае с помощью echo выводится некоторое диагностическое сообщение и подключается файл класса:
При этом в данном случае неважно какой класс, главное, чтобы он хранился в одноименном файле с расширением .php . В этом случае программа выведет следующее:
Вызов функции автозагрузки Name: Tom Age: 25