我正在尝试创建一个动态导航类。
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 中知道为什么会这样?
答案 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 的助手是单身人士。
我认为这是实现的唯一方法,就是使用会话。