Каков наилучший способ хранения переменных конфигурации в PHP? - PullRequest
24 голосов
/ 27 февраля 2009

Мне нужно хранить кучу информации о конфигурации в PHP.

Я учел следующее ....

// Doesn't seem right.
$mysqlPass = 'password'; 

// Seems slightly better.
$config = array(
     'mysql_pass' => 'password'
);

// Seems dangerous having this data accessible by anything. but it can't be
// changed via this method.
define('MYSQL_PASSWORD', 'password'); 

// Don't know if this is such a good idea.
class Config
{
    const static MYSQL_PASSWORD = 'password';
}     

Это все, о чем я думал до сих пор. Я намереваюсь импортировать эту информацию о конфигурации в мое приложение с require /config.inc.php.

Что работает для вас при хранении данных конфигурации, и каковы рекомендации по этому поводу?

Ответы [ 4 ]

7 голосов
/ 27 февраля 2009

Я всегда использовал вариант № 2 и просто гарантирую, что никто, кроме владельца, не имеет НИКАКОГО доступа к нему. Это самый популярный метод среди приложений PHP, таких как Joomla, vBulletin, Gallery и многие другие.

Первый метод мне неопрятен (удобочитаемость), а третий слишком опасен. Я никогда не думал о методе Class, так что кто-то другой может предоставить свой вклад в этот метод. Но я думаю, что это нормально, если для использования класса используется правильный доступ.


Пример ..

define('EXAMPLE1', "test1"); // scenario 1
$example2 = "test2"; // scenario 2

function DealWithUserInput($input)
{
   return eval($input);
}

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

Сценарий 2 вызовет проблему, только если вы сделаете его глобальным в функции. В противном случае он выходит из области видимости и недоступен.

4 голосов
/ 27 февраля 2009

Я бы сказал, что это также немного зависит от пользовательской базы. Если конфигурации должны быть очень удобными для пользователя или у пользователя должна быть возможность изменять конфигурацию через Интернет и т. Д.

Я использую Zend Config Ini для этого и других параметров хранятся в БД SQL.

1 голос
/ 27 февраля 2009

Я обычно использую второй метод ... При обработке соединений с базой данных я обычно открываю соединение в начале запроса, а затем закрываю его в конце. У меня есть функция, которая устанавливает соединение, а затем удаляет имя пользователя / пароль из глобального массива (с помощью функции unset ()). Это не позволяет другим частям системы получить доступ к «конфиденциальным» данным подключения mysql.

0 голосов
/ 27 февраля 2009

Я также с опцией 2 для большинства значений конфигурации. Если бы вы собирались реализовать класс, я бы привязал конкретные значения к классу, на который он влияет, вместо общего класса конфигурации.

В вашем примере ваш класс предназначен для соединений с базой данных, а экземпляр будет сохранять пароль, имя_базы данных и т. Д. Это будет правильно инкапсулировать данные, а также обеспечит простой способ создания нескольких соединений, если это когда-либо понадобится.

...