PHP OOP ::保持所有类都可访问的配置'全局'值

时间:2011-01-05 19:07:59

标签: php oop factory global

我使用Factory类来管理对象的实例化,并将任何依赖对象(依赖注入)传递给它们的构造函数,例如。

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

我试图避免在任何类(除了Factory之外)中使用'new'关键字,以允许更简单,更健壮的单元测试,更清晰的代码等。

现在,我的问题涉及许多类所需的配置值,例如。

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

这些值对于每个应用程序实例保持不变。我目前将它们放在单例类Config中,并且可以通过以下方式从任何类中访问它们:

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

但是,这个类实例仍然是调用它的任何Class中的依赖项,所以我应该考虑将它传递给类构造函数,例如。

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 个答案:

答案 0 :(得分:1)

我一直把它们视为常数。我不知道这是“最好的”解决方案,但我已经看过这个,并且多次使用它。因为它是一个const(对于静态变量也是如此,我很想知道为什么一个比另一个更好)你不需要实例化这个类,如果你想要挑剔的话可能会节省一些开销...

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

然后当你需要使用它时需要文件并执行类似

的操作
SomeClass::MYCONST //to get your config info

答案 1 :(得分:1)

似乎失败了拥有全局可用的单例配置对象的目的。整个要点是避免将其作为参数传递给您所制作的每个班级。

答案 2 :(得分:0)

我使用类似的方法,在一个数组或文件中设置所有内容并相应地定义它:

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

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