За последние 24 часа нас посетили 23683 программиста и 1549 роботов. Сейчас ищут 833 программиста ...

Вот зачем они пишут в каждом инклюде __DIR__ ?

Тема в разделе "PHP для новичков", создана пользователем machetero, 11 сен 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Зачем при подключениии файла писать __DIR__ ? Всё равно ведь путь указывается от текущей директории.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    dirname ( __FILE__ ) есть круче :D
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @machetero счавобы от текущей директории? По всему include_path-у же. А так ты явно указываешь абсолютный путь (поскольку __DIR__ считается от корня) с небольшой относительной математикой. Тебе от этого профит в том что ты всегда знаешь как у тебя файлы друг по отношению к другу лежат и не накосячишь с инклюдами. Системе должен быть профит на просмотр одной локации вместо списка предположений до первого совпадения.
     
    machetero нравится это.
  4. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ganzal Теперь сами будем юзать __DIR__ ))
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Если использовать __DIR__ то переименование директории выше не приведет к катастрофическим последствиям. Хотя этого понадобиться никогда не должно, но мало-ли.
     
    Fell-x27 нравится это.
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Должно-должно. Всяко бывает. Мб что-то глобальное ты переименовывать не будешь, а вот внутри какого-нибудь компонента - запросто. Так что это оч полезная фича.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Подкину ещё одну причину: бывает что скрипты, вызываемые по крону, используют те же модули, что и веб скрипты. А понятие "текущая директория" у них разное. Указание __DIR__ снимает неопределённость.

    В некоторых системах для тех же целей используют некую константу, которую определяют в точке входа:
    PHP:
    1. define('SITE_ROOT', dirname(__FILE__).'/');
    и затем везде
    PHP:
    1. if (!defined('SITE_ROOT')) exit;
    2. include SITE_ROOT.'include/common.php';
    Тут типа ещё и "защита" от прямого обращения. Сам так не пишу, но встречаю часто.
     
    askanim нравится это.
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    у меня в точности так и сделано. Только назвал ROOT :)
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А если скрипт лежит в одном каталоге, а точка входа находится в нестандартном месте? Что тогда будет с относительными путями, использующими этот ROOT?
    --- Добавлено ---
    Я, кстати, присоединюсь - по инклуд-пасу проверка идет разве не уже после того, как оказалось, что в текущей директории нужного файла нет?
    --- Добавлено ---
    Вопрос снят, залез в доку:
    --- Добавлено ---
    Ну и еще будет полезным:

    Так что писать, в случае, если надо дернуть соседний файлик, без __DIR__ и обхода инклуд-паса, в общем-то можно.
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Fell-x27
    Ну и дом же, не с крыши начинают строить, а с земли. Где фундамент зальём от туда и пляшем.
    Разве это плохо?) Что точка входа в корне )
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ирония в том, что как раз-таки файл конфига обычно и выносят наружу из проекта. Там закрытая инфа. Если у тебя слетит PHP, ну мало ли что сломается, то сервер начнет плеваться исходниками. Не помогут никакие "защиты от прямого доступа через константы". А в исходнике конфига у тебя явки-пароли для бд и не только.
     
    askanim нравится это.
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Fell-x27 Прошу прощения удалил, пост. Я посчитал его не целесообразным маленько. Просто у меня уже два часа ночи. Один глаз закрыт, мозг отключен, а руки ещё печатают. У меня заголовок From, с сервера приходит почему - то имя пользователя с которого отправляется письмо на сервере, хотя всё через яндекс идёт, а отправлю mail() и указываю заголовки.. Вот не задача. Спать хочу ><
    --- Добавлено ---
    Но тут правда. Тогда как быть и как защитить свои константы?
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет, не плохо, это обычное дело. Но вот у меня, например, платформа, лежащая в одном каталоге, может быть базой для N независимых сайтов. То есть физически один инстанс движка используется несколькими ресурсами. Как трехглавый Змей Горыныч. Голов три, а сердце одно. И вот тут уже нельзя надеяться на то, что точка входа вернет корень при объявлении через dirname или __DIR__.
    --- Добавлено ---
    Выложить файл с конфигом на уровень выше, чем твой Public-html, или что там у тебя является корнем в сервере. И прописывать при линковке абсолютный путь до него. Да, народ, если увидит исходники, увидит и этот путь. А постучаться по нему не сможет. Админку тоже выносят за пределы корня очень часто.
     
    askanim нравится это.
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я вот ща задумался. И понял что внатуре если он не в папке веб сервера, то его ни как не получат... Где вы были гуру. Я терь понял соль жизни, но уже поздно. Надо перенастроить по шурику корень папки в движке. И закину точку входа во внутрь, и всё... А всё остальное будет сводится в ней и получается доступ ко всем файлам и папкам на сервере будет сам собой закрыт...
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А теперь я напомню о том, что не на всех хостингах так можно делать. Если, конечно, у тебя не VDS. Ну...ессно речь не о локалке.
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не забывай, что "текущий" каталог идёт обычно первым в инклюд-пасе. Но если ты директиву перенастроишь - начнется карнавал.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Судя по докам, все печальнее и он идет последним..
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    текущий идет первым, это "." в include_path.
    --- Добавлено ---
    если её не будет в include_path, то php всё равно попробует найти файл в текущей директории после всех остальных возможностей.
     
    machetero нравится это.
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А, вот вы о чем. Ок.
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Начни читать книги, это я узнал в первой книге по PHP которую читал.
     
    askanim нравится это.
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А еще это можно узнать, самому собрав окружение и настроив хосты на сервере. Когда работаешь на каком-нибудь денвере опенсервере или что там в моде нонче, это все для тебя закрытый ящик. Когда соберешь стэк сам, начнешь врубаться, что там да к чему. Начнешь понимать, чем php-fpm отличается от mod_php или почему не надо ставить Апач на фронт. Научишься настраивать удаленный доступ к БД и так далее.
     
    askanim нравится это.