假设我们有单身类
class Registry {
private static $_instance;
private function __construct() {}
private function __wakeup() {}
private function __clone() {}
private $_map = array();
public static function getInstance () {
if (self::$_instance === null)
self::$_instance = new self();
return self::$_instance;
}
public function set ($key, $val) {
self::getInstance()->_map[$key] = $val;
return self::getInstance();
}
public function get($key)
{
if (array_key_exists($key, self::getInstance()->_map))
return self::getInstance()->_map[$key];
return null;
}
}
我们有简单的Symfony2 Controller,有2个动作
class IndexController {
public function indexAction () {
Registry::getInstance()->set('key',true);
return new Response(200);
}
public function secondAction () {
$val = Registry::getInstance()->get('key');
return new Response(200);
}
}
我调用index action,然后调用第二个动作。但我无法找到关键,这是在第一个动作中设定的。我认为,新的单身实例在我的第二个动作中创造。为什么对象没有保存在内存中?我做错了什么?
答案 0 :(得分:1)
如果您在不同的请求中调用indexAction
和secondAction
,它将无法按您希望的方式运行,因为请求之间不会共享Registry
实例。
Singleton
本身不存储任何“在内存中”(BTW Singleton
现在被视为anti-pattern)。
我认为,您希望实现的目标可以通过使用会话存储来完成。请查看doc以获取有关如何实现此目标的更多信息。