Предоставляет ли 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);

после его написания можно получить доступ к области включения файла.