Как кошерно организовать хранение констант и переменных, которые используются каждой страницей сайта на любой глубине вложенности?
я делал в файле index.php одну константу ROOT потом с помощью нее вызывал файл что то типа settings.php и туда уже все константы записывал... но архитектура приложения само собой предусматривает одну точку входа)
Ну так я ж написал "для переменных". ТС спрашивал и про то и про то. Если хочется константы - храни их вообще где хочешь. А вот переменные, доступные отовсюду и всегда - это глобалки. Если не хочешь выстрелить себе в ногу, не допускай наличия стихийных глобалок в коде. Юзай только те, что прописал сам в registry.
Ok, имеем что-нить типа MySite.ru/include/config.php в котором есть константы и глобальные переменные. На каждой страничке делаем вставку <?php include_once("/include/config.php");?> Честно говоря, смущает вопрос доступности файла по данному пути из папок различной глубины.
Вам же сказали, во фронте константу с базой объявите. Кстати, там же можно и включение сделать, если речь действительно о глобальном конфиге, например: PHP: define('PATH',dirname(dirname(__FILE__)).'/mods/'); ... include_once(PATH.'include/config.php'); --- Добавлено --- Переменные на любой глубине не видны, если не обращаться к ним через $GLOBALS. Как выше написали, используйте методы/ф-ции для установки/изменения их значений. --- Добавлено --- Ну и логично упаковать в объект во избежание всякого-разного. Для процедурки можно использовать массив, про кот. «должна знать каждая собака», во избежание того же самого.
Зачем два dirname? Не понял. А чем вот так некошерно? PHP: $Conf = 'http://'.$_SERVER['HTTP_HOST'].'/include/config.php'; define('PATH', $Conf); include_once(PATH);
Ну во-первых кто ж инклудит код по http? Что ты таким образом наинклудишь-то? Во-вторых, завтра сайт перейдет на https, у тебя все ляжет. Инклудить всякое нужно только по относительным путям в файловой системе. --- Добавлено --- И да, dirname(dirname( тоже плохое решение. --- Добавлено --- Есть $_SERVER['DOCUMENT_ROOT'] - от него и пляшите. Подниматься наверх дирнеймами и раскрытиями ../ можно только когда вы на 146% уверены, что это будет работать всегда одинаково и не зависит от внешних условий.
Ну не в корне лежит mods, а рядом. Всякие /../../ в абс. путях не люблю. Не, тож не люблю эту лабуду. В примере я показал отсчет от местоположения фронта, а не от корня сайта, хотя часто это действительно одно и то же. --- Добавлено --- Вспомнил еще, что для процедурки можно использовать статические переменные, если совместить установку/получение значения в одной ф-ции (выше вот тут я описался: установки/изменения).
@miketomlin, поэтому в файле index.php PHP: define(ROOTDIR, __DIR__); // или dirname(__DIR__) и от неё пляшем
Да, пляшите, от чего угодно. Я показал пример не определения рута, а лежащего рядом с ним каталога, т.к. не имею привычки держать конфиги в паблик-каталоге. Часто отдельно определяю ROOT[PATH] и PATH.
Относительные пути - это канешЪ хорошо, но не всегда практично. Берем $_SERVER['DOCUMENT_ROOT']. Получаем что-нить типа /home/v/user21tb/mysite.ru/public_html И что с этим добром делать, если мне, например, нужно применить пути между страницами? Точнее, применить то можно, даже работать будет отлично для инклуда, а в других случаях ссылок между страницами? Тогда для <a href=... придется костыль ставить, переформатируя портянку от 'DOCUMENT_ROOT'. Поэтому отсчет пути от MySite.ru, т.е. от фронта, становится симпатичнее, а для довеска "https://" нет никаких проблем один раз в одном месте добавить "s".
Так вы про инклуды и спрашивали. Для ссылок совсем др. подходы используются: абс. пути с/без схемы/хоста, либо тег base. Хотя для отображения адресов в ФС, если нужно работать с файлами/каталогами на стороне сервера, все равно нужно добавлять базу.
Всегда. Однако, у вас, как говорят, каша в голове. Все в кучу. Вы путаете относительные и абсолютные пути, а также чистые и mapped. И понимание всего этого дико перемешано между собой.
Да, да. Именно так. Объясните на примере, в чем гешефт от 'DOCUMENT_ROOT'? Вот нахрена мне портянка до фронта, если от фронта типа $_SERVER['HTTP_HOST']/include/cohfig.php приведет меня к искомому?
Вы понимаете, что вы инклудите. Скрипт. По http. Через дополнительный запрос на уровне сети? Нет? И у вас все работает?
[отредактировал] Вот тут пардон. Инклуд у меня просто от фронта без http. $Conf = 'http://'.$_SERVER['HTTP_HOST']./страница.php' использую для ссылок между страницами. Я как раз хотел бы разобраться, как сделать правильно. Вот здесь http://phpfaq.ru/newbie/paths например, сказано Вы же говорите о преимуществе относительного пути. Вот я и хочу увидеть воочию преимущество того или иного способа. Понятно, что абсолютность/относительность пути ... хе, относительна. Можно оперировать "до фронта/после фронта", "по адресу/физич. пути"
А в каком контексте? А в статье о чем речь идет в этот момент? То-то и оно. В статье речь идет о том, что, если выставляешь ссылку, то полагаться на относительные пути от скрипта, который ее выставляет, не стоит. Потому что браузер будет ее неверно мапить. Речь именно о ссылках. И да, там рекомендуют использовать абсолютные пути от 'SERVER_ROOT', что я и сказал. И я перечитал сообщение свое, с которого началась дискуссия, да, я не корректно выразился. Тут, под относительными путями я имел ввиду те, что идут от 'SERVER_ROOT', а не от корня сервера. Если использовать пути абсолютные по системе, от корня, то у проекта будет очень плохая портабельность между системами. При переносе с одного сервера на другой все упадет скорее всего. Если же использовать пути от 'SERVER_ROOT', такого не произойдет. Но с точки зрения системы в целом, путь от 'SERVER_ROOT' относительный, так как зависит от контекста выполнения, а не прописан четко от корня. Это могло ввести в заблуждение.
Спс, верно ли понимаю? Немного резюмирую. Верна ли концепция? 1. Пути для инклуда. В начале каждой страницы получаем переменную пути, которую затем используем для вставки include… php в данной странице. Данная переменная будет создаваться для каждой страницы. Типа: PHP: <BODY> <?php $PATH=$_SERVER['DOCUMENT_ROOT'].'/include/'; ?> <?php include(echo $PATH.'config.php); ?> ... </BODY> 2. Для ссылок на страницы, с учетом того, чтобы не костЫлить href PHP: <BODY> <?php $PathIm='http://'.$_SERVER['HTTP_HOST'].'/image/'; ?> <a href=<?php echo $PathIm.'fon.png); ?> >"Это ссылка</a> ... </BODY>
Уверены, что в первом пункте нужен echo в include? Оно немного не так работает. И не проще ли один раз открыть php-тег, чем делать это в каждой строке? И зачем это делать посреди HTML-вывода? Вы точно php-разработчик? В остальном, в общем да, как-то так.
Написал в онлайне навскидку. Редактирование куда-то пропадает, не исправить текст. Все работает. PHP: <?php $PATH=$_SERVER['DOCUMENT_ROOT'].'/include/'; ?> <!-- Полный физический путь к папке /include/ --> ..... <?php include($PATH."config_site.php") ; ..... $PathHTTP='http://'.$_SERVER['HTTP_HOST']; // адресный путь http://mysite.ru ?> Вопрос: где правильно расположить проверку этих путей? В начале секции BODY или все же в самом начале страницы, до <!DOCTYPE HTML PUBLIC ...
Правильно - это вообще отделить шаблон от логики приложения. Там, где вот HTML генерится, должна быть только логика вывода данных. Логика самого приложения, обработка данных, проверки путей и все такое должны быть вынесены в другие сущности. Иначе запутаешься нафиг. Это вот то самое MVC. Model View Controller. Обработка данных, обработка вывода и управление приложением - это разные узлы приложения.