我使用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;
}
非常感谢任何关于最佳方法的指导。
谢谢,詹姆斯
答案 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);
}