background image

这个函数做了这么个事情:
$this->_container = Zend_View_Helper_Placeholder_Registry::getRegistry()-
>getContainer(__CLASS__);
又出现了 Zend_View_Helper_Placeholder_Registry(我翻译为:Zend 视图助手注册表)
getRegistry() 将 Zend_View_Helper_Placeholder_Registry 作为
key,Zend_View_Helper_Placeholder_Registry 类的实例作为 value 注册到之前见过的
Zend_Registry 中。这个类的构造函数就什么事都没有。
getRegistry()返回了 Zend_View_Helper_Placeholder_Registry 实例,下面调用
getContainer(__CLASS__)

 

。 这里的__CLASS__是什么,当前调用的类,自然就是

Zend_Layout 了。这里是 getContainer("Zend_Layout")
进入到 getContainer 里面,它调用了
createContainer("Zend_Layout")。createContainer("Zend_Layout")是在 Registry 中以
Zend_Layout 为 key,Zend_View_Helper_Placeholder_Container 类为 value 的 array。
Zend_View_Helper_Placeholder_Container 实现抽象类
Zend_View_Helper_Placeholder_Container_Abstract,这个抽象类实际上也是一个
ArrayObject,这个在之前的文章有提到过了,是一个和泛型类一样的东东。
好了,这里不跟下去了,回头到 Zend_Layout 的构造函数
_initVarContainer 结束了,下面是调用两个重要的函数:
$this->_setMvcEnabled(true);
$this->_initMvc();
Mvc 大家一定很熟悉,我们来看看这里是怎么个 MVC 的
setMvcEnabled 没什么特别,设置标志位 this->_mvcEnabled
_initMvc 做了两件事,_initPlugin 和_initHelper。
先看 initPlugin:
获取 PluginClass,这里的 pluginClass 就是 Zend_Layout_Controller_Plugin_Layout,可以看到,
这里是作为一个插件的形式放进来的。
接着又获取了 Zend_Controller_Front 的实例,调用:
$front->registerPlugin(
new $pluginClass($this),
99
);
记得前面对 Zend_Controller_Front 的分析不?里面有 registerPlugin 的函数,是将插件委托
给 front 的 broker 来用。有人就会问后面的 99 是什么意思?是插件的索引顺序,越后面的
插件越后执行插件的动作。
下面再看_initHelper:
获取 helperClass,这里的 helperClass 就是 Zend_Layout_Controller_Action_Helper_Layout
if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) {
。。。
Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this));
}
如果 Action_HelperBroker 没有 layout 的 helper 的话