Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94

Поясните, почему предпочтительнее указывать путь через __DIR__?

23.02.2015, 12:37. Показов 3555. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, объясните мне почему предпочтительнее указавать путь вот так "__DIR__."/index.php"", чем как обычно "site/index.php". Зачем лишнее писать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2015, 12:37
Ответы с готовыми решениями:

Как указывать путь к файлам?
Всем доброй поры суток! Есть у меня проблемка..В общем, не знаю, как правильно указать путь. Вот кусок кода из проги: xmlDoc =...

Через что предпочтительнее подключить монитор, через HDMI или Display Port?
Ребят, всем привет!) Подскажите, через что предпочтительнее подключить монитор, через HDMI или Display Port? Доп. инф., если...

Записываю программу на диск и указывать путь
привет,записал программу на диск приношу на другом компьютере exe запускаю но пишет что укажите путь к базе данным acces.dmb в...

5
171 / 153 / 67
Регистрация: 11.02.2015
Сообщений: 450
23.02.2015, 12:43
Это разные вещи: абсолютный путь и URL. И потом, __DIR__ возвращает только имя папки.
0
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
23.02.2015, 12:50  [ТС]
Мой препод почему-то орёт на то, когда Я указываю ссылку вторым способом, говорит, мол нужно первым,т.е. через __DIR__, Я не дождавшись следующего урока, решил сам узнать...Вот скажем вот здесь:require_once "models/index_model.php"; он говорит что __DIR__ нужно использовать. Для чего?Ведь и так всё работает...
0
171 / 153 / 67
Регистрация: 11.02.2015
Сообщений: 450
23.02.2015, 14:28
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Ведь и так всё работает...
Ваш препод прав: в частном случае может работать, но если вы будете исполнять скрипт с разных папок или ваш код является шаблоном, то могут быть проблемы.
1
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
23.02.2015, 14:35
Лучший ответ Сообщение было отмечено Кателевский ВН как решение

Решение

разница в том, что с __DIR__ путь раскрывается в абсолютный, когда без него вы используете относительный.
При использовании относительного пути происходит поиск файлов по всем директориям, которые указаны в переменной include_path. При указании абсолютного пути вы абсолютно точно идентифицируете путь к файлу, поэтому поиска не происходит -- интерпретатор просто пытается открыть один-единственный файл.
Теперь представьте, что у вас такая структура каталогов:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
|-- dir1
|   |-- file2.php
|   `-- file.php
|-- dir2
|   |-- file2.php
|   `-- file.php
|-- dir3
|   |-- file2.php
|   `-- file.php
|-- dir4
|   |-- file2.php
|   `-- file.php
.............
`-- dir9
    `-- index.php
а в include_path:
Code
1
.;C:/mysite/html/1;C:/mysite/html/2;C:/mysite/html/3;C:/mysite/html/4;...;C:/mysite/html/9
и вы сейчас находитесь в директории 'C:/mysite/html', которая и является корневой для вашего сайта.
В таком случае, при выполнении
PHP
1
include 'index.php'
интерпретатору придется пройти по директориям:
Code
1
2
3
4
5
6
.
C:/mysite/html/1
C:/mysite/html/2
C:/mysite/html/3
C:/mysite/html/4
......
в поисках файла с именем 'index.php', но ни в одной из директорий его нет, кроме 'C:/mysite/html/9', которая будет обходиться последней.
Если бы вы написали
PHP
1
include __DIR__.'/dir9/index.php'
то никакого поиска бы не происходило, поскольку вы указали абсолютный, единственно возможный, путь, и интерпретатор попытался бы прочитать только его.
Одним словом, абсолютный путь позволяет найти конкретный файл быстрее в такой ситуации.

Однако, в реальности в include_path обычно прописано всего несколько директорий, и он очень часто начинается с директории '.'(т.е. текущая директория), поэтому лишних проверок не должно быть, если файл находится в текущем каталоге.
Можете попробовать сделать бенчмарк и проверить, однако я сомневаюсь что там будет что-то, кроме флукутаций, ибо операции ввода-вывода будут происходить заведомо дольше конкатенации строк

Не по теме:

впрочем, если дело происходит в ramfs, то, может, что-то и получится замерить



Короче говоря, в реальности разница несущественна, если, конечно, у вас не очень много директорий в include_path. Тем не менее, почему-то с давних пор считается моветоном указывать относительный путь, наверное поэтому ваш преподаватель и ругается, хотя в реальности это правило акутально, по большей части, лишь для небольших standalone-библиотек, пути к которым в include_path запихивать как-то не комильфо, особенно в начало, да и в общем-то не имеет особого смысла в них использовать относительные пути -- в 99.9% случаев им нужен лишь конкретный файл, вычислить абсолютный путь которого не составляет труда.
А вот в каком-нибудь крупном фреймворке использование include-ов с относительными путями могло бы помочь: например, когда есть несколько директорий с одинаковой структурой (к примеру, default-шаблоны движка и локальные, для конкретного сайта), можно прописать их обе в include_path и include-ить файлы из них по относительному пути.

В подтверждение того, что отказ от абсолютных директорий не так уж сильно влияет на производительность, является то, что многие из библиотек pear их не используют.
Есть, однако, и еще один 'недостаток' от использования относительных путей: появляется своего рода неоднозначность, когда существует множество файлов с одинаковым именем. Как, например, тот же
PHP
1
include 'index.php';
Если не задумываться о структуре каталогов и не знать, что находится в include_path, то можно успешно подгрузить какой-нибудь другой index.php

Не по теме:

разумеется, если у вас множество папок с этим файлом, и если они указаны в include_path

Однако, если знать как это все работает, то этого легко избежать, продумав структуру каталогов заранее (ее все равно придется продумывать), ну а если сомневаетесь, то можно взять за правило: прописывать их абсолютными путями в обязательном порядке.

Не по теме:

Я в курсе, что не совсем прав насчет относительных и абсолютных путей, и что путь './file.php' тоже будет относительным, однако он не задействует include_path. В контексте данного сообщения следует воспринимать этот путь как 'абсолютный', ибо он тоже однозначно указывает путь, относительно текущего каталога. Под относительными путями я имел ввиду лишь те, обработка которых происходит с учетом include_path.
Разработчики php вставили такую рекомендацию:

Использование . в include_path позволяет задавать относительные пути для подключения файлов, так как точка означает текущую директорию. Однако, более эффективно использовать include './file', чем заставлять PHP каждый раз проверять текущую директорию при подключении каждого файла.

2
 Аватар для Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
23.02.2015, 15:05  [ТС]
Благодарю, за развёрнутое разъяснение, всё понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2015, 15:05
Помогаю со студенческими работами здесь

Как правильно указывать путь к файлу?
При работе с файлами нужно обязательно указывать полный путь к файлу, начиная от диска на котором он лежит?

Поясните цикл парсинга даты из вывода команды Dir
Добрый день! Есть батник @echo off for /F "tokens=1-3,4*" %%a in ('dir C:\Back\ /a:-d ^| findstr "%date%"') do ( (dir...

Как программно указывать путь к базе данныx?
Подскажите, пожалуйста. Я делаю приложение, где перед началом работы мне надо сделать копию базы данныx (Access), которая xранится на...

Как правильно указывать путь css селекторов
Как будет правильнее и влияет это на что-либо ? .sidebar ul li a .sidebar a <div class="sidebar"> ...

Как в коде DLL указывать относительный путь?
Привет! Ребят, кто плотно работал, либо работает с dll, подскажите пожалуйста, есть ли аналог такого кода для dll? Если в программе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru