0

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

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

4 回答 4

2

PHP 不像 Java 那样运行,你有一个 JVM 来维护你的类的状态。在 Java 中,您可以让单例的行为与您描述的完全一样,但在 PHP 中,所有类都会随着对 Web 服务器的每次后续调用而刷新。因此,您的单例将在对该服务器的调用期间保持原位,但是一旦发送响应,您就会在下一次调用时重新开始。

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

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

于 2012-10-23T09:11:20.930 回答
0

即使这是旧的,我想加我的 2 美分。

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

这就是您的问题所在。由于对每个请求都进行了引导,因此每个请求还会重新初始化您的辅助方法。据我所知,ZF 1.x 中的助手不能是单例。

我认为这是实现您希望它成为的唯一方法是使用会话。

于 2014-08-18T08:16:46.797 回答
0

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

PHP 是一种无共享架构;每个请求都从一个新进程开始,在请求结束时,所有请求都被丢弃。跨请求持久化根本不可能发生——除非你自己做缓存。您可以序列化对象并恢复它们——但实际上,在大多数情况下,您不会从中获得什么好处(并且经常会遇到各种问题,尤其是在资源句柄方面)。

您可能想要使用 Zend_cache 来实现持久性

于 2012-11-23T15:01:46.717 回答
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
    {
         // ...
    }

    // ...
}
于 2012-10-23T09:06:14.190 回答