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)
好主意还是坏主意?
好吧,它可能是对全局变量的改进,因为它解决了全局变量导致的所有丑陋的范围问题.摆脱全球运营商通常是一件好事!你所做的与单身模式并没有什么不同,尽管它相当简单.(有关模式的更多信息,请参阅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.它们可能是您当前需求的偶然因素,但无论是现在还是将来都可能有所帮助.
归档时间: |
|
查看次数: |
1402 次 |
最近记录: |