PHP __DIR__ Demo

Подключение файлов

Способность вызывать сценарий из отдельного файла по его имени называется в PHP подключением файлов. Подключают PHP-сценарии, любые текстовые файлы или HTML-страницы.

Зачем разделять и подключать PHP-сценарии

PHP-разработчики дробят исходный код проекта на отдельные сценарии, чтобы было проще работать. Если написать код в одном файле, сценарий станет необъятным, и ориентироваться будет невозможно.

Если вынести повторяющиеся блоки кода в отдельные сценарии, то появится возможность повторно использовать один код в разных файлах и подключать его только по требованию.

Например, пользовательские функции удобно объявлять в отдельном сценарии, а затем подключать там, где эти функции понадобились.

Способы подключения файлов — require и require_once

Для подключения файлов в PHP есть две языковые конструкции: require и require_once . Отличия между ними минимальны. Оба этих ключевых слова подключают файл с указанным именем и вызывают ошибку, если данный файл не существует.

👉 Особенность работы require_once — он позволяет подключать файл только один раз, даже если вызывать инструкцию несколько раз с одним именем файла.

Примеры подключения файлов

Рассмотрим, как подключить один сценарий внутри другого. Для этого воспользуемся инструкцией require . Предположим, у нас есть два сценария: index.php и sub.php .

В файле index.php находится код, который подключит сценарий sub.php :

Читайте также:  Enable error and warning in 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 __DIR__

Summary: in this tutorial, you’ll learn about how to use the PHP __DIR__ magic constant when including a PHP file.

Introduction to the PHP __DIR__ magic constant

PHP 5.3 introduced a new magic constant called __DIR__ . When you reference the __DIR__ inside a file, it returns the directory of the file. The __DIR__ doesn’t include a trailing slash e.g., / or \ except it’s a root directory.

When you use the __DIR__ inside an include, the __DIR__ returns the directory of the included file.

Technically speaking, the __DIR__ is equivalent to the dirname(__FILE__) . However, using the __DIR__ is more concise than the dirname(__FILE__) .

Simple PHP __DIR__example

Suppose you have the following directory structure:

. ├── inc │ ├── footer.php │ └── header.php └── index.phpCode language: CSS (css)

The header.php contains the code of the header part:

 "en"> "UTF-8"> "viewport" content="width=device-width, initial-scale=1.0">   Code language: PHP (php)

The footer.php contains the code of the footer part. It also shows the value of the __DIR__ constant:

echo __DIR__ ?>

Code language: PHP (php)

The index.php includes both header.php and footer.php files. It also shows the value of the __DIR__ constant:

 require 'inc/header.php' ?> 

Home

echo __DIR__ ?>

require 'inc/footer.php' ?>
Code language: PHP (php)

The following shows the output on the web browser:

Home C:\xampp\htdocs\web C:\xampp\htdocs\web\incCode language: PHP (php)

The __DIR__ in the index.php returns the current directory of the index.php C:\xampp\htdocs\web while the __DIR__ in the footer.php file returns the directory of the footer.php file C:\xampp\htdocs\web\inc .

Why using PHP __DIR__

Suppose that you have a project with the following directory structure:

. ├── admin │ └── dashboard │ └── index.php ├── config │ └── app.php ├── inc │ ├── footer.php │ └── header.php └── public └── index.phpCode language: CSS (css)

The config/app.php contains the application’s configuration:

 define('APP_NAME', 'My Awesome App');Code language: PHP (php)

The header.php contains the header part of a page. It also includes the config/app.php file and uses the APP_NAME constant:

 require '../config/app.php' ?> "en"> "UTF-8"> "viewport" content="width=device-width, initial-scale=1.0">   Code language: PHP (php)

The footer.php contains the closing tags of the body and html elements:

The public/index.php file includes both header.php and footer.php files:

 require '../inc/header.php' ?> 

Home

require '../inc/footer.php'?>
Code language: PHP (php)

If you navigate to the http://localhost/web/public/index.php , you’ll see the following output when you view the source of the page:

 "en"> "UTF-8"> "viewport" content="width=device-width, initial-scale=1.0">   

Dashboard

Code language: PHP (php)

So the index.php page in the public directory works as expected.

The index.php in the admin/dashboard also includes the header.php and footer.php files:

 require '../../inc/header.php' ?> 

Dashboard

require '../../inc/footer.php' ?>
Code language: PHP (php)

When you browse the page http://localhost/web/admin/dashboard/index.php , you’ll see the following error:

Warning: require(../config/app.php): failed to open stream: No such file or directory in C:\xampp\htdocs\web\inc\header.php on line 1 Fatal error: require(): Failed opening required '../config/app.php' (include_path='\xampp\php\PEAR') in C:\xampp\htdocs\web\inc\header.php on line 1Code language: PHP (php)

The error message shows that the header.php cannot load the ‘../config/app.php’ file.

When the index.php in the admin/dashboard directory loads the code from the header.php , it’ll find the config/app.php inside the admin directory, not root directory.

Since the admin directory doesn’t have the config/app.php file, PHP issues an error.

To fix this issue, you can use the __DIR__ when you include the config.php in the header.php file like this:

 require __DIR__. '/../config/app.php' ?>Code language: PHP (php)

The index.php in the admin/dashboard will work correctly.

This is because when PHP loads the inc/header.php file from either public/index.php or admin/dashboard/index.php , the __DIR__ inside the inc/header.php always returns C:\xampp\htdocs\web\inc .

Therefore, it’s a good practice to use the __DIR__ constant when you include a file.

Summary

  • PHP __DIR__ returns the directory of a file or the directory of the include file when the file is used as an include.
  • Use __DIR__ when you include a file.

Источник

PHP требует файл из верхнего каталога

У меня есть несколько поддоменов, содержащихся в их собственном каталоге выше моего корневого сайта и папка с ресурсами в моем корневом каталоге. Например:

Я пытаюсь потребовать() файлы на php-страницах как в корневом каталоге, так и в подкаталогах, например, assets/include/form.php требуется() как в index.php в корневом каталоге, так и в индексе .php в каталоге форумов. Однако внутри form.php требуется другое, пытаясь получить еще один файл, содержащийся в каталоге include. Я не могу найти способ потребовать файл внутри этого form.php, где он будет работать как в корневом каталоге index.php, так и в справочном каталоге index.php. Можно ли явно указать файл, начинающийся с корневого каталога?

5 ответов

Использовать относительный путь от form.php

require_once __DIR__ . '/otherfile.php'; 

Если вы используете PHP 5.2 или старше, вы можете использовать dirname(__FILE__) вместо __DIR__ . Подробнее о магических константах здесь.

Используйте переменную $_SERVER[‘DOCUMENT_ROOT’]

Это абсолютный путь к вашему корню документа: /var/www/example.org/ или C:\wamp\www\ в Windows. Корень документа — это папка, в которой находятся файлы вашего корневого уровня: http://example.org/index.php находится в $_SERVER[‘DOCUMENT_ROOT’] . ‘/index.php’ Использование: require_once $_SERVER[‘DOCUMENT_ROOT’] . ‘/include/otherfile.php’;

Использовать автозагрузчик

Настройка PHP включает пути

Вы также можете установить каталоги, в которых PHP будет искать файлы при использовании require() или include() . Ознакомьтесь с set_include_path() здесь. Использование: require_once ‘otherfile.php’; Примечание: Я вижу, что некоторые ответы предлагают использовать URL-адрес внутри require() . Я бы не предложил это, так как файл PHP будет разбираться до его включения. Это нормально для HTML файлов или PHP-скриптов, которые выводят HTML, но если у вас есть только определение класса, вы получите пустой результат.

Источник

Вывести значение php require выше?

delphinpro

Роман Юрьевич Ипатьев, это не возможно? Просто скажите ссылкой — почему в php нельзя извлечь данные и вставить их выше?

delphinpro

Михаил Лебедев, Почему нельзя-то?
Я же вам там и написал — сначала извлеките данные. Для этого код извлечения перенесите выше.

В конце концов, не нужно копипастить советы как есть.
Посмотрите, что у вас там внутри parser.php, отделите код, который получает данные и кладет их в переменную $datata в отдельный файл. И этот файл подключайте вначале страницы.

delphinpro

Михаил Лебедев, Сразу отвечу на ваш вопрос:

НЕЛЬЗЯ сначала показать данные из переменной, а потом их туда положить.
Это как выпить стакан воды перед тем как его наполнить =))

ipatiev

Сергей delphinpro, он боится (и в целом обоснованно) что этот парсер положит ему весь сайт, ну или по крайней мере затормозит.
То есть нежелание запускать его до начала вывода довольно осмысленное.
Другое дело что человек с логикой не в ладах, и не понимает, что фарш невозможно провернуть назад и сначала что-то вывести на клиенте, а потом перебежать назад и поменять то что уже было выведено. Ну по крайней мере так как он хочет — то есть чтобы и парсинг был на каждой странице, и чтобы перебежать можно было на РНР.
А так-то исходная проблема решается элементарно

ipatiev

delphinpro

Роман Юрьевич Ипатьев, согласен, опасения обоснованные. Но других вариков нет. Переделывать/рефакторить. Возможно кешировать результаты парсинга, хз как оно там устроено.

Михаил Лебедев, при такой постановке задачи этого сделать, разумеется, нельзя. Это иначе делается. На странице заводится пустой элемент (например, div), в footer пишется script, который отдельно дёрнет другой скрипт, отдающий нужные данные, и вставляющий их в этот div. Если совсем говнокодом, то можно получить div через getElementById и присвоить полю element.innerHTML возврашённое тем самым другим скриптом (вызванным через ajax-запрос) значение уже с нужной HTML-разметкой.

zaza41rus

Не сработало подстановка выше
Вставил отдельным муплагином parser.php в начало страницы
теперь на каждой выводиться код в body
$datata = 1234;

так же данный вывожу в тот див где нужно на этой странице ниже

НО КРОМЕ
в плагине который выводиться ниже перед закрытием тега body
в нем пустая (((

куда нужно смотреть, почему эти данные не отображаются на той же странице ниже ?

delphinpro

shurshur, да, интересная мысль. Говнокодить так уж по полной =) Впрочем иногда без этого не обойдешься.
Только аякс здесь излишен.

Вверху пишем див с айдишником
Внизу простая вставка на js

 форма заполнения  меню   

zaza41rus

Сергей delphinpro, это решение отобразило данные везде
правда теперь на страницах где нет myDiv выдает TypeError: Cannot set properties of null (setting ‘innerHTML’) ))))
но это исправлю

а не подскажите как за место div указать value=»»

и почему это говнокод — когда это просто работает ?

zaza41rus

Разобрался с value=»» и с TypeError
теперь с говнокодом все работает

и машина времени оказывается делается на раз два

единственное, что не понимаю — почему простое и рабочее решение в одну строчку кода называют говнокодом

delphinpro

Вовсе нет. Говоря про «машину времени» имели ввиду решение исключительно на php. А здесь мы просто перенесли реализацию на сторону браузера. Мы по прежнему не используем данные из php переменной до того как их туда положили.

Отвечу цитатой одного из посетителей этого сайта:

Новичку отличить говнокод от нормально кода очень сложно.
Говнокод коварен.
Во-первых, он синтаксически правильный.
Во-вторых, он работает.

Источник

Оцените статью