Opencart 之 Registry 类详解

Registry 中文意思是记录,登记,记录本的意思, 在opencart中他的用途就是 登记公共类.
类的原型放在 systemengine文件夹下 代码很简单:

    <?php
    final class Registry {
       private $data = array();

       public function get($key) {
          return (isset($this->data[$key]) ? $this->data[$key] : NULL);
       }

       public function set($key, $value) {
          $this->data[$key] = $value;
       }

       public function has($key) {
           return isset($this->data[$key]);
         }
    }
    ?>

$data数组用来存放公共类的实例, 在opencart初始化完成后 会有19个公共类被实例化后放到Registry 类的$data数组中 ,分别为:load、config、db、url、log、request、response、cache、session、language、 document、customer、affiliate、currency、tax、weight、length、cart、encryption 这19个都是对应类的实例,也就是说你可以直接使用的!
  是不是看名字就是知道这些类是干什么的。 load是加载类,config是配置 ,db数据库 language 网站语言, currency 货币类, tax税率 cart购物车, 不过要注意有几个类实例化时是要读数据库的,这些类的原型都在systemlibrary下 大家可以去看看。

然后实例化控制器、模 型、前端控制器等类的时候 $Registry 实例会当做参数传入。这样新建的类实例会得到一个公共类实例的花名册也就是$Registry ,在新实例中就可以通过Registry 调用公共类了 。 当然调用时候他用魔术方法转换了下。拿load类来说,在控制器中调用的话应该用$this->Registry->load这样应该不难理 解, 但是实际上调用时用$this->load很多人会很纳闷,其实他用了下魔术方法 下边这段代码是控制器中的魔术_get代码 ,在控制器中没有个叫load的方法,他就会调用魔术方法_get()
实现的调用$Registry 中的实例、这样再调用 $this->load 会被_get方法 转换成 $tthis->registry->get(‘load’) 也就是用的$data数组中存放的那个load实例了! 以后再用公共类时已可以直接用$this->类名了 ,这样大家该知道他是从哪里来的,该去哪找了吧!

    public function __get($key) {
          return $this->registry->get($key);
       }   
       public function __set($key, $value) {
          $this->registry->set($key, $value);
       }

文章来源:http://www.opencartchina.com/bbs/topic589.html

原文地址:https://www.cnblogs.com/mssql8/p/3832702.html