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

标签 php design-patterns global-variables

我有一个类,我在我的代码中到处都在使用它。它包含设置和其他核心功能。这是我现在正在做的事情,以使用该类(class)。

$settings = new Settings();
$settings->loadSettings();

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

function abc() {
    global $settings;
    $variable = $settings->a;
}

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

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

Settings::$settings = new Settings();
Settings::$settings->loadSettings();

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

function abc() {
    $variable = Settings::$settings->a;
}

好主意还是坏主意?

最佳答案

嗯,这可能是对全局变量的改进,因为它解决了全局变量引起的所有丑陋的范围界定问题。摆脱全局运营商通常是一件好事!您所做的与单例模式没有什么不同,尽管它要简单得多。 (有关该模式的更多信息,请参阅 http://php.net/manual/en/language.oop5.patterns.php 的“单例”部分。)您的解决方案几乎可以肯定地满足您的目的。

另一方面,可能有更好的方法来实现同样的事情,从而进一步解耦您的代码。也就是说,每个类都变得更有能力在另一个项目中使用,而无需进行大量重新编码。一种方法是将设置对象“注入(inject)”到每个类中:

class ABC {
    private $settings;

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

    public function someMethod() {
        $variable = $this->settings->a;
    }
}

这会增加工作量,但可能会提高代码的可重用性。例如,您可以为每个项目编写不同的设置类,但使用相同的 ABC 类。

将一个对象“注入(inject)”到另一个依赖它的对象的过程称为依赖注入(inject)。还有其他更复杂的方法可以做到这一点,包括复杂的容器。参见 http://fabien.potencier.org/article/11/what-is-dependency-injection有关该主题的一组有趣的教程。它们可能与您当前的需求无关,但现在或将来可能会有所帮助。

关于php - 好主意还是坏主意?使用静态类变量存储全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731483/

相关文章:

java - 在 Java 的子类中专门化方法参数

java - 如何抽象转换类型

c - 在整个程序的头文件中共享变量和结构

php - 如何使用 DAO 检测 Yii 事务中的最后一个插入 ID?

php - 在 PHP 中将文本转换为 PDF

wpf - 为什么不使用部分类以MVVM模式构建ViewModel?

javascript - JS : How to use abbreviations for full named variables?

r - 如何使在函数内创建的对象在外部可用

php - 回显边框底部 php

PHP xpath 包含类和不包含类