PHP OOP :: содержит конфигурационные «глобальные» значения, доступные для всех классов - PullRequest
2 голосов
/ 05 января 2011

Я использую класс Factory для управления созданием объектов и передаю в их конструкторы любые объекты зависимостей (Dependency Injection), например

function createBasket() {
    //pass in dependent objects
    $apiCon = $this->createAPIConnector($this);
    $basket = new Basket($this, $apiCon);
    return $basket;
}

Я стараюсь избегать использования ключевого слова new в любых классах (кроме Factory), чтобы сделать возможным более простой и надежный модульный тест, более понятный код и т. Д.

Теперь мой вопрос относится к значениям конфигурации, которые требуются многим классам, например,

$apiURL = 'http://some.api.com';
$apiKey = 'abcde12345';
$adminEmail = 'someone@site.com';

Эти значения остаются постоянными для каждого экземпляра приложения. В настоящее время они находятся в одном классе Config, и они доступны из любого класса следующим образом:

$cfg = Config::getInstance();
$address = $cfg->apiURL;

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

function createBasket() {
    //pass in dependent objects
    $apiCon = $this->createAPIConnector($this);
    $cfg = Config::getInstance();
    //pass singleton config object to constructor
    $basket = new Basket($this, $apiCon, $cfg);
    return $basket;
}

... или, возможно, передать их через метод set, а не через конструктор:

function createBasket() {
    //pass in dependent objects
    $apiCon = $this->createAPIConnector($this);
    $basket = new Basket($this, $apiCon);
    //pass singleton config object to setter
    $basket.setConfig(Config::getInstance());
    return $basket;
}

Будем весьма благодарны за любые рекомендации относительно наилучшего подхода.

Спасибо, Джеймс

Ответы [ 3 ]

1 голос
/ 05 января 2011

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

1 голос
/ 05 января 2011

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

class SomeClass
{
     const MYCONS = "APIKEY or Whateva";
}

тогда, когда вам нужно его использовать, нужно файл и сделать что-то вроде

SomeClass::MYCONST //to get your config info
0 голосов
/ 05 января 2011

Я использую аналогичный метод, настраивая все в одном массиве или файле и определяя его соответственно:

$config = array(
    'MYCONST_1'=>'myValue',
    'USER'=>'username',
    'PASSWORD'=>'y3ahr1ght'
);

foreach($config as $const=>$value){
    define($const,$value);
}
...