这里是Erich Gamma,Singleton模式的发明者之一,不得不说的是:
"I'm in favor of dropping Singleton. Its use is almost always a design smell"
因此,我建议使用Dependency Injection而不是单身人士。
在创建$ this之前创建助手实例。然后通过setter方法或通过构造函数将助手实例从外部设置到$ this实例。
作为替代,创建一个知道如何通过名字来实例化助手并传递到$这个实例的助手经纪人
class HelperBroker
{
protected $helpers = array();
public function getHelper($name)
{
// check if we have a helper of this name already
if(!array_key_exists($name, $this->helpers)) {
// create helper and store for later subsequent calls
$this->helpers[$name] = new $name;
}
return $this->helpers[$name];
}
}
可以根据需要你懒负荷助手通过这种方式,将永远无法获得第二个例子,而不必使用Singleton。将代理的实例传递给需要使用助手的每个类。
实例与单个帮手
$helper = new Helper;
$someClass = new Something($helper);
和
class Something
{
protected $helper;
public function __construct($helper)
{
$this->helper = $helper;
}
public function useHelper()
{
$return = $this->helper->doSomethingHelpful();
}
}
在$东西,你现在可以直接存储和访问辅助实例。你不需要实例化任何东西。事实上,$某种东西甚至不必担心助手是如何实例化的,因为我们给它提供了一些它可能需要的东西。
现在,如果你想在$ SomeClass的使用超过一个帮手,你会使用相同的原则:
$helper1 = new Helper;
$helper2 = new OtherHelper;
$something = new Something($helper1, $helper2);
这份名单将得到相当长的您将更多的依赖前期。我们可能也不想实例化所有帮助者。这就是HelperBroker进场的地方。我们没有将每个助手作为准备好的实例传递给$ something,而是注入了一个知道如何创建助手的对象,并且跟踪它们。
$broker = new HelperBroker;
$something = new Something($broker);
和
class Something
{
protected $helperBroker;
public function __construct($broker)
{
$this->helperBroker = $broker;
}
public function doSomethingHelpful()
{
$return = $this->getHelper('foo')->doSomethingHelpful();
}
public function doSomethingElse()
{
$return = $this->getHelper('bar')->doSomethingElse();
}
}
现售的东西可以得到它所需要的帮手,当它从代理需要他们。另外,任何需要访问helper的类现在不再需要为如何创建helper而烦恼,因为这个逻辑被封装在broker中。
$broker = new HelperBroker;
$something = new Something($broker);
$other = new Other($broker);
该券商还可以确保你只能有一个帮助程序实例,因为当一个帮手被实例化,它存储的经纪人内并在后续调用返回。这解决了你最初的问题,你不想恢复任何助手。它也不会强迫你的助手知道如何在全球化状态下管理自己,比如Singleton。相反,你的帮手可以专注于他们的责任:帮助。这是干净,简单和可重复使用的。
出于好奇:当你赋值'$ user = array()'时,getHelperInstance()怎么被调用? – Gordon 2010-03-24 20:22:04
我的不好,用户不是空的 – Rachel 2010-03-24 20:24:38
以及如何使用PHP4的可见性? PHP4中不存在可见性。尝试打开命令提示符并输入'php -v'来查看您使用的PHP版本。 – Gordon 2010-03-24 20:25:55