Рекомендуемый способ управления данными и настройками глобальной области видимости в PHP? - PullRequest
6 голосов
/ 22 апреля 2011

После нескольких лет разработки на PHP я видел и слышал различные способы хранения «данных глобальной области видимости» (глобальные переменные, константы, файлы ini / XML / YML, базы данных, одноэлементные свойства ...).

Под "глобальными данными области" я подразумеваю:

  • Глобальные настройки приложения / проекта, такие как
    • Конфигурация базы данных
    • SMTP, параметры FTP
  • Идентификаторы базы данных (например, значения первичного ключа для определенных языков или стран, определенных в БД)
  • Глобальные настройки времени выполнения, такие как
    • Включить ведение журнала / отладку
    • Среда разработки / тестирования / производства
  • и т.д.

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

Некоторые глобальные данные, возможно, должны храниться как ассоциативный массив (поэтому не могут быть объявлены как константы).
Например: форматы даты для каждого языка. Кстати, я видел этот другой SO вопрос о константах массива, но разве нет ничего более читабельного, чем использование unserialize везде, где необходимо постоянное значение массива?

Мой главный вопрос: каким образом вы бы порекомендовали хранить правильно (я имею в виду чистые, читаемые, надежные) данные глобального объема и почему (плюсы / минусы)?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 апреля 2011

Вы можете посмотреть Zend_Config для наиболее частых реализаций конфигурации.

  • массив (только php, немедленный, но разбросанный и труднее для чтения)
  • ini (легко читать и писать от руки)
  • xml (многословный и сложный в обращении, но очень гибкий)
  • json (довольно легко читается, может быть здорово, если вы хотите получить к нему доступ напрямую через js)
  • yaml (вы в основном пишете сериализованный массив)

Конечно, массив может показаться самым непосредственным и несложным решением, поскольку он является чистым PHP и не требует какого-либо специального синтаксического анализатора или средства записи.

С другой стороны, другие форматы также имеют явные преимущества. Документация Zend_Config пишет, например, об INI-файлах.

Формат INI специализируется на обеспечить как возможность иметь иерархия ключей данных конфигурации и наследование между конфигурацией разделы данных. Данные конфигурации иерархии поддерживаются разделяя ключи точкой или символ точки (".").

Использование констант не очень хорошая идея, потому что:

  1. вашему приложению не нужно постоянно видеть все параметры конфигурации и
  2. что еще более важно, вы не можете вкладывать константы, а вложение является действительно важным для конфигурации.
2 голосов
/ 22 апреля 2011

Вы можете сохранить настройку по своему усмотрению. Я неравнодушен к массивам PHP или файлам INI.

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

Этот класс проанализирует ваше хранилище настроек и создаст внутреннюю структуру данных. Просто убедитесь, что у вас нет сеттеров, чтобы данные не могли быть переопределены. Посмотрите, как Zend реализует свой класс Zend_Config. Вот о чем я говорю: http://framework.zend.com/manual/en/zend.config.html

Убедитесь, что ваш класс доступа доступен глобально, чтобы вы могли получить доступ к настройкам в любое время.

2 голосов
/ 22 апреля 2011

На мой взгляд, лучший способ управлять всей конфигурацией с помощью файлов INI.

например. я создаю один файл configuration.ini, в котором хранятся все настройки системы, такие как информация о базе данных, URL и т. д. ...

host_name="localhost";
database_name="my_database";
database_user="root";

Во время чтения вам просто нужно проанализировать этот INI-файл в php, используя функцию php по умолчанию,

$configuration = parse_ini_file("path/to/configuration.ini");
1 голос
/ 22 апреля 2011

parse_ini_file

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

; This is an array
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

Кроме того, добавление этого в файл INI (первые строки в файле) помогает обеспечить его безопасность:

;<?php die("<br /><br /><br /><br /><br /><h3>404 Not Found</h3><br /><br />The requested resource could not be found."); ?>
;Secure INI file
...