Каков наилучший способ получить переменные конфигурации в классе в PHP 5? - PullRequest
1 голос
/ 02 декабря 2008

Это для моего класса БД. Я новичок в ОО, был процедурным парнем в течение некоторого времени, поэтому я все еще немного темный.

Моей первой идеей было использование набора функций / методов установки ... но после написания всей этой группы я подумал об использовании функции определения PHP, например, так.

define('MYSQL_USERNAME', 'jimbo');

Это принятая практика? Какова лучшая практика? Должен ли я действительно загромождать свой класс кучей функций сеттера (в настоящее время я являюсь единственным разработчиком, использующим эти классы). Каковы ваши решения?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 декабря 2008

Я использую const только для создания мнемонических имен для неизменяемых констант в классе. Функция define() не создает константы как часть класса, она создает константы в глобальном пространстве.

class MyClass
{
  const CONFIG_FILE = 'myapp.ini';

Данные о конфигурации класса, которые я обычно объявляю как хеш-массив protected в классе. Ключи полезны для мнемоники. Значения по умолчанию.

  protected $config = array(
    'logfile' => 'err.out',
    'debug' => false
  );

Затем я загружаю файл формата "ini" с parse_ini_file() и использую array_merge() для сопоставления ключей в массив конфигурации вашего класса:

  public function __construct() {
    $ini_data = parse_ini_file(self::CONFIG_FILE, __CLASS__);
    $this->config = array_merge($this->config, $ini_data);
  }

}
2 голосов
/ 02 декабря 2008

, вероятно, есть несколько вариантов решения этой проблемы:

  1. просто используйте сеттеры, это вполне приемлемо, но может стать немного "многословным" с большим количеством опций конфигурации.

  2. использовать объект конфигурации для передачи:

    $config = (object) array(
       'prop1' => 'somevalue',
       'prop2' => 'somevalue2',
       'prop3' => 'somevalue3',
    );
    
    $db = new DB($config);
    
  3. если вы хотите использовать константы, вы можете ограничить их классом, чтобы избежать загрязнения глобального пространства имен:

    class DB {
        const USER = 'mysqluser';
    }
    
    echo DB::USER; // for example
    
0 голосов
/ 19 февраля 2015

Я добился большого успеха в этом двумя способами:

  1. , как рекомендует @Owen, используя константы класса

    class Config {
        const PASSWORD_LENGTH = 12;
        const SEND_PASSWORD_EMAILS = true;
        // ...
    }
    
  2. Для простых переменных конфигурации (то есть без массивов и т. Д.) Пакет vlucas / phpdotenv , доступный в composer, отлично работает. Файл .env содержит всю вашу конфигурацию:

    PASSWORD_LENGTH=12
    SEND_PASSWORD_EMAILS=1
    

Затем он становится доступен через getenv() или $_ENV superglobal.

    Dotenv::load(__DIR__);
    $passwordLength = $_ENV['PASSWORD_LENGTH']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...