1. “Registry”设计模式 在OpenCart中,Registry是整个系统的信息中枢。 Registry是一个单例(Singleton),在index.php起始页面中, 首先作为构造函数参数传递给所要用到的类创建类实例,并随之将这个类实例设置到这个“注册表”中, 这个注册表就像是一个共享的数据总线一样,把各个模块/数据串联在一起。 2、整体流程 (1)创建Registry对象 (2)注册所有公共类 (3)创建Front类对象,作为请求分发器(Dispatcher) (4)根据用户请求(url)创建控制器对象及其动作。 在Front类私有函数execute($action)中如下语句 $controller = new $class($this->registry); //创建控制器 (5)控制器加载相应的模型,如 $this->load->model('design/layout'); 该语句将创建相应的model对象。 (6)控制器获取模板,绘制(提取数据并启用output buffer)到页面输出区output中 $this->render(); (7)最后Response对象把输出区的数据(页面)echo返回给用户 3、魔术函数(Magic method) 在Controller中调用$this->load->...时,熟悉面向对象语言的开发人员会觉得有点奇怪,因为Controller基类中并没有$load成员变量。 实际上这是由PHP5魔术函数来实现的。__get(), __set()函数在获取/设置非类定义成员变量的时候,会由PHP自动调用。 那么OpenCart中在执行$this->load->...时实际调用的是: public function __get($key) { return $this->registry->get($key); } 现在体会到Registry‘共享总线’的作用了吧。(责任编辑:最模板) |