Предоставляет ли PHP файл *.properties, как в Java?
Есть ли способ использовать файл *.properties в PHP, как в Java? Я хотел бы сохранить некоторые константы уровня приложения в свойствах или XML файле и легко вызвать их из всего кода. Ваше руководство очень ценится. Спасибо.
Ответы
Ответ 1
PHP может изначально загружать и анализировать файлы .ini
, используя parse_ini_file()
.
Вы также можете настроить константы во включенном файле с помощью define()
.
Если вы настроены на XML, посмотрите на функциональность PHP XML. Простейшим решением является, вероятно, использование SimpleXML.
Ответ 2
Вы также можете использовать файл PHP, содержащий массив для хранения данных.
Пример:
config.php
<?php
return array(
'dbhost' => 'localhost',
'title' => 'My app'
);
Затем в другом файле:
$config = require 'config.php':
echo $config['title'];
Ответ 3
parse_ini_file
не имеет ничего общего с *.properties
файлами в средах Java.
Я создаю эту функцию, которая делает то же самое, что и ее эквивалент в Java:
function parse_properties($txtProperties) {
$result = array();
$lines = split("\n", $txtProperties);
$key = "";
$isWaitingOtherLine = false;
foreach($lines as $i=>$line) {
if(empty($line) || (!$isWaitingOtherLine && strpos($line,"#") === 0)) continue;
if(!$isWaitingOtherLine) {
$key = substr($line,0,strpos($line,'='));
$value = substr($line,strpos($line,'=') + 1, strlen($line));
} else {
$value .= $line;
}
/* Check if ends with single '\' */
if(strrpos($value,"\\") === strlen($value)-strlen("\\")) {
$value = substr($value, 0, strlen($value)-1)."\n";
$isWaitingOtherLine = true;
} else {
$isWaitingOtherLine = false;
}
$result[$key] = $value;
unset($lines[$i]);
}
return $result;
}
Эта функция была первой размещенной в моем блоге.
Ответ 4
Хорошо, вы могли бы поместить некоторую конфигурацию в файл свойств и выполнить синтаксический анализ самостоятельно. Но в PHP это не соответствующий формат todo so.
Я бы определил некоторые константы и поместил их в отдельный конфигурационный файл php (например, config.php) и включил его там, где это было необходимо.
Другие варианты состоят в том, чтобы фактически разместить конфигурацию в XML файле и использовать xml-библиотеку, прочитав ее. YAML (php.net) также является популярным вариант для простой читаемой конфигурации.
Ответ 5
Насколько я знаю, нет встроенных функций PHP для чтения и обработки файлов .properties. Если приложение, написанное в PHP, должно читать файлы Java.properties, вам нужно закодировать свое собственное решение, прочитав файл и создав собственный анализатор .properties.
В противном случае, как упоминалось другими членами здесь, вы можете хранить информацию о конфигурации в файле .ini. PHP предоставляет собственные функции для загрузки и анализа файлов .ini.
Если вы предпочитаете, чтобы информация хранилась в XML файле с парсером PHP XML (Справочник по функциональным возможностям PHP по XML-манипуляции).
Лично я предпочитаю хранить значения константы конфигурации/приложения в массиве. Я создал класс конфигурации, который обрабатывает файл конфигурации.
Здесь есть пример:
Пример файла конфигурации (ex: config.php)
<?php
// Typical configuration file
$config['database']['type'] = 'mysql';
$config['database']['host'] = 'localhost';
$config['database']['username'] = 'root';
$config['database']['password'] = 'your_password';
$config['database']['database'] = 'your_project';
$config['date']['timezone'] = 'America/Montreal';
?>
Конфигурация класса
<?php
class Configuration
{
protected $configuration;
function __construct($filename)
{
// CFG_PATH : i.e --> define('CFG_PATH',dirname(__FILE__) . '/cfg/');
require(CFG_PATH . $filename);
$this->setConfiguration($config);
}
public function getConfiguration($configuration)
{
return $this->configuration[$configuration];
}
public function setConfiguration($configuration)
{
$this->configuration = $configuration;
}
}
?>
Пример типичного использования
<?php
// Your class definitions, variables, functions...
function __construct() {
$this->configuration = new Configuration(CFG_FILE);
$this->set_Timezone($this->configuration->getConfiguration('date'));
}
private function set_Timezone($configuration)
{
date_default_timezone_set($configuration['timezone']);
}
?>
Другой пример (контроллер и DAO)
контроллер
<?php
protected function doPost() {
...
$configuration = new Configuration(CFG_FILE);
$dao = new DAO($configuration->getConfiguration('database'));
...
}
?>
Пример DAO
<?php
function __construct($configuration) {
// Build DSN (Data Source Name) string
if ($configuration['type'] == 'mysql') {
$this->dsn = '(type):host=(host);dbname=(database);charset=UTF8';
$this->dsn = str_replace('(type)', $configuration['type'], $this->dsn);
$this->dsn = str_replace('(host)', $configuration['host'], $this->dsn);
$this->dsn = str_replace('(database)', $configuration['database'], $this->dsn);
$this->options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'');
try
{
$this->databaseHandle = new PDO($this->dsn, $configuration['username'], $configuration['password'], $this->options);
}
catch (PDOException $e)
{
...
}
}
else
{
...
}
}
?>
Если вы используете фреймворк Spring в Java и хотите получить аналогичное решение для messages.properties в PHP, вы можете адаптировать то же самое решение, о котором говорилось выше. Конечно, поведение не будет таким же, как Java, но с классом Locale вы можете создавать функции, которые обрабатывают сообщения/метки в вашем приложении PHP, в зависимости от местоположения, в котором находится клиент.
С таким решением, основанным на массивах, я думаю, что это поможет вам определить требуемые значения в вашем приложении и организовать ваши данные конфигурации. Конечно, есть много других способов достичь этого, но я думаю, что это решения.
Ответ 6
В файлах PHP.ini почти одинаковые функции. Существуют простые методы для чтения констант из этих файлов.
В дальнейшем большинство фреймворков PHP реализуют его с файлами конфигурации в основном с расширением .php.
например, в cake php, мы имеем Configure класс, который предоставляет как Configure:: read ('VarName') и Configure:: write ('VarName', VarValue);
после его написания можно получить доступ к области включения файла.