2010-03-24 57 views
0
public function getHelperInstance() 
{ 
    $user = new Helper(); 
    $user->set($result['data']); 
    return $user; 
} 

我多次调用getHelper()类,如果$ user不是空的,而是调用getHelperInstance(),现在在我的情况下,getHelperInstance()总是创建一个新的Helper()类实例,所以每当我调用getHelperInstance()函数创建一个新的Helper()实例,那么有什么办法可以在哪里创建一个Helper()实例并多次使用它,而不是每次创建一个新实例。有什么建议么 !!!如何删除多个实例,只有一个实例,而多个函数在PHP中调用?

public function getHelper() 
{ 
    $user = array(); 
    if (!empty($user)) 
    { 
     $user = $this->getHelperInstance(); 
    } 
    return $user; 
} 
+0

出于好奇:当你赋值'$ user = array()'时,getHelperInstance()怎么被调用? – Gordon 2010-03-24 20:22:04

+0

我的不好,用户不是空的 – Rachel 2010-03-24 20:24:38

+0

以及如何使用PHP4的可见性? PHP4中不存在可见性。尝试打开命令提示符并输入'php -v'来查看您使用的PHP版本。 – Gordon 2010-03-24 20:25:55

回答

2

这里是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。相反,你的帮手可以专注于他们的责任:帮助。这是干净,简单和可重复使用的。

+0

这个不清楚。你能解释一下吗? – Rachel 2010-03-24 21:16:45

+0

@Rachel哪部分你需要更多信息? – Gordon 2010-03-24 21:42:56

+0

我无法理解帮手经纪人的观点。希望你能解释一下HelperBroker如何工作。 – Rachel 2010-03-24 22:09:32

1

这听起来像你对singleton pattern感兴趣。如果你使用的是PHP5 +,你应该能够利用PHP的面向对象的东西。

+0

正在使用PHP 4,对此有任何建议。 – Rachel 2010-03-24 20:10:01

+3

升级php5,认真php5在这里自2004年以来和php4不支持,因为几年已经http://www.php.net/archive/2007.php#2007-07-13-1 – Mathieu 2010-03-24 20:16:49

+0

是的。我正在使用5.2.9,应该如何实现。 – Rachel 2010-03-24 20:36:03

1

Here's an article就如何落实在PHP4一个单身的任何控制。 (不过,我会强烈建议升级到PHP5,如果这是一个选项,在所有)

class Singleton { 
    function Singleton() { 
     // Perform object initialization here. 
    } 

    function &getInstance() { 
     static $instance = null; 
     if (null === $instance) { 
      $instance = new Singleton(); 
     } 
     return $instance; 
    } 
}