使用PHP的单例模式

时间:2012-10-23 08:57:24

标签: zend-framework singleton

我正在尝试创建一个动态导航类。

class myApp_Helper_Breadcrum{
    protected $navigationArray=array();
    private static $_instance = null;
    public static function getInstance()
    {
         if (!isset(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    private function __construct() {
         $this->navigationArray = array();
    }

    public  function popin($popInElement){
        array_push($this->navigationArray,$popInElement);
    }

    public  function displayLinks()
    {
          //print array
    }
}

在boostrap中我做了以下

$nlinks=myApp_Helper_Breadcrum::getInstance();
Zend_Registry::set('nlinks',$nlinks);

现在在我的控制器中,我打电话给跟随

$nlinks= Zend_Registry::get('nlinks');
$nlinks->popin('Home');
$nlinks->displayLinks();

问题是,即使这个类是单例,也会一次又一次地调用构造函数,这使我的数组初始化。我想要实现的是在我浏览网站时继续推送导航阵列中的项目。

ZF 中知道为什么会这样?

4 个答案:

答案 0 :(得分:2)

PHP没有像Java那样运行JVM来维护类的状态。在Java中,您可以使用与您描述的完全相同的单例行为,但在PHP中,所有类都会在每次后续调用Web服务器时刷新。因此,您的单身人士将在呼叫服务器期间保持原状,但一旦发送了响应,您将在下一次呼叫时重新开始。

如果您想通过连续调用维持状态,则需要使用$ _SESSION来跟踪您的状态。

编辑: 我上面的回答一般涉及PHP而不是Zend Framework。请参阅下面的评论。

答案 1 :(得分:0)

尝试按以下方式定义您的组件:

class MyApp_Helper_Breadcrum
{
    private static $_instance = null; // use private here

    public static function getInstance()
    {
        if (self::$_instance === null) { // use strictly equal to null
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    private function __construct() // use private here
    {
         // ...
    }

    // ...
}

答案 2 :(得分:0)

我遇到了完全相同的问题。 问题是类的持久性在请求范围内。 使用zend,您甚至可以有多个页面加载请求。

PHP是一种无共享架构;每 请求从一个新进程开始,在请求结束时,它就是全部 扔掉了。坚持跨越请求根本不可能发生 - 除非 你做自己的缓存。您可以序列化对象并恢复它们 - 但实际上,在大多数情况下,你将从中受益匪浅 这(并经常遇到各种各样的问题,特别是当问题来临时) 资源处理)。

您可能希望使用Zend_cache来实现持久性

答案 3 :(得分:0)

尽管这已经过时了,但我想加上我的2美分。

Zend 不会创建一个在多个请求中持续存在的单例。无论ZF文档的解释如何,在每个请求上,都会重新初始化整个堆栈。

这是您的问题所在。由于自举是在每个请求上完成的,因此每个请求也会重新初始化您的帮助方法。据我所知,ZF 1.x CAN' T 的助手是单身人士。

我认为这是实现的唯一方法,就是使用会话。