Как добиться "переменных области приложения" в php? - PullRequest
0 голосов
/ 26 декабря 2010

Сейчас я работаю над новым проектом PHP, на этот раз я хочу получить основы прямо в начале.Ранее я обнаружил, что требовать / включать файлы в php немного больно, пожалуйста, рассмотрите следующую структуру:

/application_root/index.php
                 /js/...
                 /css/...
                 /php/...
                 /conf/...
                 ...

В index.php я, безусловно, могу использовать что-то вроде:

<link rel="stylesheet" href="css/sample.css" ... />
<script type="text/javascript" src="js/sample.js"></script>

Для ссылки на включенные css и js или даже фрагменты php.Тем не менее, это будет работать только в index.php, который находится в корне папки моего приложения.Я считаю, что это бесполезно.

Я наткнулся на файл конфигурации приложения Java "web.xml", где вы можете определить переменные области приложения, на которые вы можете просто ссылаться..NET с C # имеет аналогичную вещь.Как добиться этого в простом php-коде, чтобы из любого php-файла в моем приложении я мог набрать:

<?php echo "<link href='".$application_root_url."/php/sample.css' ..."; ?>

И он будет вычислен в нужном месте?

Я думаю:используйте:

  • Глобальные переменные <== плохая практика как нарушение ООП?Я перестал это делать, поскольку программирование на c; </li>
  • set_include_path <==, так что php будет его искать, требует уникального имени и правильного соглашения об именах? </li>
  • загружать переменные из файлов ini?<== как это сделать? </li>
  • есть новые мысли?

Ответы [ 6 ]

3 голосов
/ 26 декабря 2010

Вы не хотите использовать глобальные переменные, потому что они нарушают инкапсуляцию .

set_include_path не принесет пользы, особенно если вы используете эти переменные в HTML, поскольку include_path относится к пути файловой системы приложения, а не к его базовому URL.

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

define('APP_ROOT', dirname(__FILE__));
define('APP_URL', dirname($_SERVER['PHP_SELF']));

Однако, если вы хотите проанализировать INI-файлы, вы можете использовать parse_ini_file или parse_ini_string (> = 5.3.0):

$config = parse_ini_file(APP_ROOT.'/'.CONFIG_DIR.'/database.ini');
echo $config['host'];
1 голос
/ 26 декабря 2010

Возможно, вы захотите попробовать что-то вроде шаблона MVC.В качестве примера MVC ZendFrameworkds передает переменную $this->base_url представлениям.Представления - это то место, где находится ваш HTML, поэтому вы можете сделать следующее:

<link rel="stylesheet" href="<?php echo $this->base_url; ?>/css/sample.css" ... />

Именно ваша проблема привела меня к шаблону MVC, и у него много преимуществ.

1 голос
/ 26 декабря 2010
  1. нет причин использовать глобальные переменные, кроме ленивого кодирования
  2. неэффективно, и PHP будет сложнее определить, какой файл будет включен, если два одинаковых имени файла по разному пути
  3. parse_ini_file - это то, что вы ищете

Тем не менее, я предпочитаю использовать constant, я не просил определять константу везде, просто поместите все ваши основные пути вКонфигурационный файл и требует, чтобы это было в начале вашего приложения.

Кто-то может сказать, что константа медленная, по сравнению с использованием константы класса, которая может потребовать включения нескольких файлов, что лучше?И самое лучшее, если однажды определена константа, никто или код не может ее переопределить.

пример для иллюстрации

define('css_root', '/home/user/apache/css');  <-- server absolute path
define('css_web_root', '/css');               <-- web root, for HTML
define('css_cache_root', '/cache/css');       <-- cache directory
1 голос
/ 26 декабря 2010

PHP-скрипт производит только вывод, который интерпретирует браузер. А область действия - это URL в браузере, а не в файловой системе.

Таким образом, значение переменной $ application_root_url предназначено для браузера, а не для сценария PHP!

Если вы хотите использовать INI-файлы, вы можете использовать функцию parse_ini_file () в PHP.

1 голос
/ 26 декабря 2010

Вы должны использовать относительный путь. Так что просто "/css/sample.css" вместо "css / sample.css".

Это всегда будет загружаться с yourdomain.com/css/sample.css, даже если ваш .php находится в yourdomain.com/somefolder/file.php

1 голос
/ 26 декабря 2010

Путь здесь - URI, а не местоположение файловой системы.Возможно, вы все равно пытаетесь ошибиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...