Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP::holding config';全球';所有类都可以访问的值_Php_Oop_Factory_Global - Fatal编程技术网

PHP OOP::holding config';全球';所有类都可以访问的值

PHP OOP::holding config';全球';所有类都可以访问的值,php,oop,factory,global,Php,Oop,Factory,Global,我使用工厂类来管理对象的实例化,并将任何依赖项对象(依赖项注入)传递给它们的构造函数,例如 我试图避免在任何类(工厂除外)中使用“new”关键字,以允许更简单、更健壮的单元测试、更清晰的代码等 现在,我的问题涉及到许多类需要的配置值,例如 $apiURL = 'http://some.api.com'; $apiKey = 'abcde12345'; $adminEmail = 'someone@site.com'; 对于每个应用程序实例,这些值保持不变。我目前在单例类配置中有它们,可以通过以

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

我试图避免在任何类(工厂除外)中使用“new”关键字,以允许更简单、更健壮的单元测试、更清晰的代码等

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

$apiURL = 'http://some.api.com';
$apiKey = 'abcde12345';
$adminEmail = 'someone@site.com';
对于每个应用程序实例,这些值保持不变。我目前在单例类配置中有它们,可以通过以下方式从任何类中访问它们:

$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;
}
如能就最佳方法提供任何指导,将不胜感激


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

class SomeClass
{
     const MYCONS = "APIKEY or Whateva";
}
然后在需要使用它时,需要文件并执行以下操作

SomeClass::MYCONST //to get your config info

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

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

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

这似乎违背了拥有一个全局可用的单例配置对象的目的。整个要点是避免将其作为参数传递给您创建的每个类。

(相关)依赖项注入是一种使用类似方法的方法,但使用的是接口,而不是与Android的ContactsContract()类似的类。谢谢。我想我更关心的是在我的类中没有“隐藏”的依赖关系。将这些值显式传递到构造函数中的想法使得IMO的代码更加清晰,特别是对于使用应用程序的新手。对象依赖于我们的所有内容在构造函数参数中都清晰可见。也许我不必要地担心这些简单的全局变量,因为它们实际上只是简单的配置参数。没有对象或大型/复杂的数据结构。创建一个类来保存这些东西不会从OOP设计中获益。。。hmmmI试图确保每个类都可以进行单元测试。我可能宁愿删除Singleton类,因为它实际上只是充当VAR的全局持有者。为了在我的应用程序中保留依赖注入,我需要一种方法来确保这些“全局”变量(和助手函数)被传递到需要它们的类中。把它们留在全球空间是很有诱惑力的,但我很确定,在6个月的时间里,我会后悔在全球拥有这么多东西,这使得单元测试变得更加棘手。给出了答案。我将重构代码,使其不依赖于单例,并根据需要将变量传递给构造函数。将使单元测试更容易,使代码更容易理解。如果可以,我将礼貌地不同意您的代码示例。对运行时可能具有不同值的变量使用应用程序范围的常量会使测试更加困难,如果单个测试类中包含每个类一个测试套件,则无法更改套件中的常量,因此需要一些变通方法,例如为文件设置两个测试套件。换句话说:除非我遗漏了什么,否则如果您的常量在应用程序中到处使用,并且在运行时在全局范围内可以有多个值,那么我(谦虚)认为这有点不对。
$config = array(
    'MYCONST_1'=>'myValue',
    'USER'=>'username',
    'PASSWORD'=>'y3ahr1ght'
);

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