Если я использую файл конфигурации для хранения, например, имя файла, хост базы данных и т. Д., Какова наилучшая практика для этого?
$sitename="stackoverflow.com";
а затем задание глобального имени файла $ sitename в функциях DEFINE(_SITENAME,"stackoverflow.com")
function vars(){return array(sitename=>"stackoverflow");}
Мне бы хотелось получить техническое объяснение, почему я должен выбирать один, а не другой.
Спасибо!
Я обычно использую define () для «экологической» конфигурации, поскольку привязка константы должна быть быстрее, чем вызов новой функции. Это также концептуально соответствует тому, что я делаю:
/** * Set the application mode. Valid options are "development" and "production" */ define('APP_MODE', 'development'); // Database Host define('DB_HOST', 'localhost');
Другим вариантом является использование ini-файлов (убедитесь, что они не находятся в корневом каталоге веб-сайта) и функция parse_ini_file()
, хотя вы должны запускать только один раз и использовать singleton для доступа к переменным после этого. (Действительно, вы должны лениво загрузить его, только разбор файла при первом запросе.)
Как правило, считается «лучшей» практикой поддерживать директивы конфигурации на уровне приложений в отдельном файле конфигурации или XML-файле. Вы можете создать класс, который загружается как одноэкземплярный экземпляр, который анализирует файл и дает вам то, что вы хотите, например:
$config->get('DB_HOSTNAME');
Посмотрите на Zend_Config .
Вы можете легко импортировать данные конфигурации как ini-файл, используя функции parse_ini_file
или parse_ini_string
. Ваша конфигурация будет храниться в том же формате, что и php.ini.
Мне нравится использовать define, так как это помешает вам случайно изменить константы позже. Это также облегчает рассказывать в вашем коде, что вы используете константу.
Другие упомянули использование файла конфигурации – это хорошая идея, но основной причиной этого на большинстве языков является то, что вы можете изменить файл конфигурации, не перестраивая / развертывая приложение. Поскольку PHP не является компилируемым языком, я не вижу большой реальной пользы для использования ini или файлов конфигурации XML в PHP.
Мне нравится использовать глобальный одноэлементный объект, в соответствии с тем, что предлагает karim79, и реализовать реализацию singleton-класса, прочитав конфигурацию из набора .ini-файлов, используя parse_ini_file. Также хорошо иметь отдельные файлы .ini для каждой серверной среды, например
production.ini testlab.ini demoserver.ini
Затем вы можете автоматически выбрать правильную конфигурацию для загрузки на основе текущего имени хоста. Вся логика для обработки этого должна быть помещена в одноэлементную реализацию.