За последние 24 часа нас посетили 17518 программистов и 1310 роботов. Сейчас ищут 780 программистов ...

Хранение/чтение констант и переменных

Тема в разделе "PHP для новичков", создана пользователем user21, 14 июн 2017.

  1. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Как кошерно организовать хранение констант и переменных, которые используются каждой страницей сайта на любой глубине вложенности?
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я делал в файле index.php одну константу ROOT потом с помощью нее вызывал файл что то типа settings.php и туда уже все константы записывал... но архитектура приложения само собой предусматривает одну точку входа)
     
    user21 нравится это.
  3. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Паттерн Registry для переменных. Реализуется через статичный класс.
     
    user21 и Алекс8 нравится это.
  4. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    константы в ООП дурой тон?
     
    user21 нравится это.
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну так я ж написал "для переменных". ТС спрашивал и про то и про то. Если хочется константы - храни их вообще где хочешь. А вот переменные, доступные отовсюду и всегда - это глобалки. Если не хочешь выстрелить себе в ногу, не допускай наличия стихийных глобалок в коде. Юзай только те, что прописал сам в registry.
     
    user21 нравится это.
  6. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Ok, имеем что-нить типа MySite.ru/include/config.php в котором есть константы и глобальные переменные.
    На каждой страничке делаем вставку <?php include_once("/include/config.php");?>
    Честно говоря, смущает вопрос доступности файла по данному пути из папок различной глубины.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.828
    Симпатии:
    651
    Вам же сказали, во фронте константу с базой объявите. Кстати, там же можно и включение сделать, если речь действительно о глобальном конфиге, например:
    PHP:
    1. define('PATH',dirname(dirname(__FILE__)).'/mods/');
    2. ...
    3. include_once(PATH.'include/config.php');
    --- Добавлено ---
    Переменные на любой глубине не видны, если не обращаться к ним через $GLOBALS. Как выше написали, используйте методы/ф-ции для установки/изменения их значений.
    --- Добавлено ---
    Ну и логично упаковать в объект во избежание всякого-разного. Для процедурки можно использовать массив, про кот. «должна знать каждая собака», во избежание того же самого.
     
    user21 нравится это.
  8. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Зачем два dirname? Не понял.

    А чем вот так некошерно?
    PHP:
    1. $Conf = 'http://'.$_SERVER['HTTP_HOST'].'/include/config.php';
    2. define('PATH', $Conf);
    3. include_once(PATH);
     
  9. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну во-первых кто ж инклудит код по http? Что ты таким образом наинклудишь-то?
    Во-вторых, завтра сайт перейдет на https, у тебя все ляжет.

    Инклудить всякое нужно только по относительным путям в файловой системе.
    --- Добавлено ---
    И да, dirname(dirname( тоже плохое решение.
    --- Добавлено ---
    Есть $_SERVER['DOCUMENT_ROOT'] - от него и пляшите. Подниматься наверх дирнеймами и раскрытиями ../ можно только когда вы на 146% уверены, что это будет работать всегда одинаково и не зависит от внешних условий.
     
    user21 нравится это.
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.828
    Симпатии:
    651
    Ну не в корне лежит mods, а рядом. Всякие /../../ в абс. путях не люблю.

    Не, тож не люблю эту лабуду. В примере я показал отсчет от местоположения фронта, а не от корня сайта, хотя часто это действительно одно и то же.
    --- Добавлено ---
    Вспомнил еще, что для процедурки можно использовать статические переменные, если совместить установку/получение значения в одной ф-ции (выше вот тут я описался: установки/изменения).
     
    user21 нравится это.
  11. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Этого всего в абсолютных путях и не бывает. Только в относительных.
     
    user21 нравится это.
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.828
    Симпатии:
    651
    Я про подобные записи:
    PHP:
    1. define('PATH',dirname(__FILE__).'/../mods/');
     
    user21 нравится это.
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.575
    Симпатии:
    1.759
    @miketomlin, поэтому в файле index.php
    PHP:
    1. define(ROOTDIR, __DIR__); // или dirname(__DIR__)
    и от неё пляшем
     
    user21 нравится это.
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.828
    Симпатии:
    651
    Да, пляшите, от чего угодно. Я показал пример не определения рута, а лежащего рядом с ним каталога, т.к. не имею привычки держать конфиги в паблик-каталоге. Часто отдельно определяю ROOT[PATH] и PATH.
     
    user21 нравится это.
  15. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Относительные пути - это канешЪ хорошо, но не всегда практично.
    Берем $_SERVER['DOCUMENT_ROOT'].
    Получаем что-нить типа /home/v/user21tb/mysite.ru/public_html
    И что с этим добром делать, если мне, например, нужно применить пути между страницами? Точнее, применить то можно, даже работать будет отлично для инклуда, а в других случаях ссылок между страницами? Тогда для <a href=... придется костыль ставить, переформатируя портянку от 'DOCUMENT_ROOT'.
    Поэтому отсчет пути от MySite.ru, т.е. от фронта, становится симпатичнее, а для довеска "https://" нет никаких проблем один раз в одном месте добавить "s".
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.828
    Симпатии:
    651
    Так вы про инклуды и спрашивали.

    Для ссылок совсем др. подходы используются: абс. пути с/без схемы/хоста, либо тег base. Хотя для отображения адресов в ФС, если нужно работать с файлами/каталогами на стороне сервера, все равно нужно добавлять базу.
     
    user21 и Fell-x27 нравится это.
  17. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Всегда.

    Однако, у вас, как говорят, каша в голове. Все в кучу. Вы путаете относительные и абсолютные пути, а также чистые и mapped. И понимание всего этого дико перемешано между собой.
     
    user21 нравится это.
  18. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Да, да. Именно так.
    Объясните на примере, в чем гешефт от 'DOCUMENT_ROOT'? Вот нахрена мне портянка до фронта, если от фронта типа
    $_SERVER['HTTP_HOST']/include/cohfig.php приведет меня к искомому?
     
  19. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Вы понимаете, что вы инклудите. Скрипт. По http. Через дополнительный запрос на уровне сети? Нет? И у вас все работает?
     
    user21 нравится это.
  20. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    [отредактировал] Вот тут пардон. Инклуд у меня просто от фронта без http.
    $Conf = 'http://'.$_SERVER['HTTP_HOST']./страница.php' использую для ссылок между страницами.


    Я как раз хотел бы разобраться, как сделать правильно.
    Вот здесь
    http://phpfaq.ru/newbie/paths
    например, сказано
    Вы же говорите о преимуществе относительного пути.
    Вот я и хочу увидеть воочию преимущество того или иного способа.
    Понятно, что абсолютность/относительность пути ... хе, относительна. Можно оперировать "до фронта/после фронта", "по адресу/физич. пути"
     
    #20 user21, 14 июн 2017
    Последнее редактирование: 14 июн 2017
  21. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    А в каком контексте? А в статье о чем речь идет в этот момент? То-то и оно. В статье речь идет о том, что, если выставляешь ссылку, то полагаться на относительные пути от скрипта, который ее выставляет, не стоит. Потому что браузер будет ее неверно мапить. Речь именно о ссылках.

    И да, там рекомендуют использовать абсолютные пути от 'SERVER_ROOT', что я и сказал.

    И я перечитал сообщение свое, с которого началась дискуссия, да, я не корректно выразился. Тут, под относительными путями я имел ввиду те, что идут от 'SERVER_ROOT', а не от корня сервера. Если использовать пути абсолютные по системе, от корня, то у проекта будет очень плохая портабельность между системами. При переносе с одного сервера на другой все упадет скорее всего. Если же использовать пути от 'SERVER_ROOT', такого не произойдет. Но с точки зрения системы в целом, путь от 'SERVER_ROOT' относительный, так как зависит от контекста выполнения, а не прописан четко от корня.

    Это могло ввести в заблуждение.
     
    user21 нравится это.
  22. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Спс, верно ли понимаю?

    Немного резюмирую.
    Верна ли концепция?

    1. Пути для инклуда.
    В начале каждой страницы получаем переменную пути, которую затем используем для вставки include… php в данной странице. Данная переменная будет создаваться для каждой страницы.
    Типа:
    PHP:
    1. <BODY>
    2. <?php  $PATH=$_SERVER['DOCUMENT_ROOT'].'/include/';  ?>
    3. <?php include(echo $PATH.'config.php); ?>
    4. ...
    5. </BODY>
    2. Для ссылок на страницы, с учетом того, чтобы не костЫлить href
    PHP:
    1. <BODY>
    2. <?php  $PathIm='http://'.$_SERVER['HTTP_HOST'].'/image/';  ?>
    3. <a href=<?php echo $PathIm.'fon.png); ?> >"Это ссылка</a>
    4. ...
    5. </BODY>
     
  23. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Уверены, что в первом пункте нужен echo в include? Оно немного не так работает.
    И не проще ли один раз открыть php-тег, чем делать это в каждой строке? И зачем это делать посреди HTML-вывода? Вы точно php-разработчик?

    В остальном, в общем да, как-то так.
     
    user21 нравится это.
  24. user21

    user21 Новичок

    С нами с:
    4 дек 2016
    Сообщения:
    50
    Симпатии:
    2
    Написал в онлайне навскидку.
    Редактирование куда-то пропадает, не исправить текст.
    Все работает.
    PHP:
    1. <?php $PATH=$_SERVER['DOCUMENT_ROOT'].'/include/';  ?>  <!--  Полный физический путь к папке /include/  -->
    2. .....
    3. <?php include($PATH."config_site.php") ;
    4. .....
    5. $PathHTTP='http://'.$_SERVER['HTTP_HOST'];  // адресный путь http://mysite.ru
    6. ?>
    Вопрос: где правильно расположить проверку этих путей? В начале секции BODY или все же в самом начале страницы, до <!DOCTYPE HTML PUBLIC ...
     
  25. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Правильно - это вообще отделить шаблон от логики приложения. Там, где вот HTML генерится, должна быть только логика вывода данных.
    Логика самого приложения, обработка данных, проверки путей и все такое должны быть вынесены в другие сущности. Иначе запутаешься нафиг. Это вот то самое MVC. Model View Controller. Обработка данных, обработка вывода и управление приложением - это разные узлы приложения.