在Mage类中使用$_registry存储生成的对象,这样生成的对象在全局都可以访问。Mage::register 函数有两种格式:
- public static function register($key, $value, $graceful = false) 注册一个新的变量 (添加)
- public static function registry($key) 通过$key获取已有变量(获取)
- public static function unregister($key) 注销一个变量(删除)
Magento源文件:
/**
* Register a new variable
*
* @param string $key
* @param mixed $value
* @param bool $graceful
* @throws Mage_Core_Exception
*/
public static function register($key, $value, $graceful = false)
{
if (isset(self::$_registry[$key])) {
if ($graceful) {
return;
}
self::throwException('Mage registry key "' . $key . '" already exists');
}
self::$_registry[$key] = $value;
}
/**
* Unregister a variable from register by key
*
* @param string $key
*/
public static function unregister($key)
{
if (isset(self::$_registry[$key])) {
if (is_object(self::$_registry[$key]) && (method_exists(self::$_registry[$key], '__destruct'))) {
self::$_registry[$key]->__destruct();
}
unset(self::$_registry[$key]);
}
}
/**
* Retrieve a value from registry by a key
*
* @param string $key
* @return mixed
*/
public static function registry($key)
{
if (isset(self::$_registry[$key])) {
return self::$_registry[$key];
}
return null;
}
总结:
- 其实就是生成一个全局变量。不允许给变量的第二次赋值,只允许赋值一次。
- 一般情况下,是在controller控制器下使用Mage::register()存储之后需要用 ,
- Registry也非常方便SEO优化,例如,Mage::registry(‘current_category’),Mage::registry(‘current_product’),获得当前分类、产品的对象,便可更加精准添加各个页面的meta相关信息,对于各大搜索引擎、社交媒体分享有诸多的帮助 。