Registry 中文意思是記錄,登記,記錄本的意思, 在opencart中他的用途就是 登記公共類.
類的原型放在 system\engine文件夾下 代碼很簡單:
<?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購物車, 不過要注意有幾個類實例化時是要讀數據庫的,這些類的原型都在system\library下 大家可以去看看。
然后實例化控制器、模 型、前端控制器等類的時候 $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