好主意还是坏主意?使用静态类变量存储全局

Kir*_*met 2 php design-patterns global-variables

我有一个我在我的代码中使用的课程.它包含设置和其他核心功能.这就是我现在正在使用的课程.

$settings = new Settings();
$settings->loadSettings();
Run Code Online (Sandbox Code Playgroud)

然后,当我需要在另一个类中的一些随机函数中的代码时,我做这样的事情:

function abc() {
    global $settings;
    $variable = $settings->a;
}
Run Code Online (Sandbox Code Playgroud)

我厌倦了随机调用全局$设置来拉入该设置对象.我不想使用$ _GLOBALS数组(我不知道为什么,我只是不想).

我想我想切换到设置中有一个名为$ settings的静态类变量.代码如下所示:

Settings::$settings = new Settings();
Settings::$settings->loadSettings();
Run Code Online (Sandbox Code Playgroud)

然后,每当我想使用它时,我都不必担心通过全局运算符将其吸入:

function abc() {
    $variable = Settings::$settings->a;
}
Run Code Online (Sandbox Code Playgroud)

好主意还是坏主意?

lon*_*day 8

好吧,它可能是对全局变量的改进,因为它解决了全局变量导致的所有丑陋的范围问题.摆脱全球运营商通常是一件好事!你所做的与单身模式并没有什么不同,尽管它相当简单.(有关模式的更多信息,请参阅http://php.net/manual/en/language.oop5.patterns.php上的"Singleton"部分.)您的解决方案几乎可以满足您的需求.

另一方面,可能有更好的方法来实现更多地解耦代码的相同事物.也就是说,每个类都能够在没有重要记录的情况下在另一个项目中使用.一种方法是将设置对象"注入"每个类:

class ABC {
    private $settings;

    public function __construct($settings) {
        $this->settings = $settings;
    }

    public function someMethod() {
        $variable = $this->settings->a;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能会更多,但可能会提高代码的可重用性.例如,您可以为每个项目编写不同的设置类,但使用相同的ABC类.

将"对象""注入"另一个依赖于它的对象的过程称为依赖注入.还有其他更复杂的方法,包括复杂的容器.有关该主题的一组有趣的教程,请参见http://fabien.potencier.org/article/11/what-is-dependency-injection.它们可能是您当前需求的偶然因素,但无论是现在还是将来都可能有所帮助.