Реестр в opencart сделан с целью хранения в нем объектов различных компонентов системы. Не знаю, почему ребята не использовали синглтон в разработке (ведь с ним реестр вовсе не понадобился-бы), но суть не в том. Реест есть и с ним нужно что-то делать.
Что он в себе хранит? В файле index.php в корне сайта можно увидеть примерно следующий код:
$registry = new Registry();
// Loader
$loader = new Loader($registry);
$registry->set('load', $loader);
// Config
$config = new Config();
$registry->set('config', $config);
Что в нем происходит? Сначала создается объект класса реестр, затем по очереди в него помещаются различные компоненты. В данном случае, loader и config.
Ну допустим, компоненты загружены. Что с ними происходит дальше и как его теперь использовать?
Если мы посмотрим на исходники абстракного класса Controller, то увидим следующий код:
abstract class Controller {
protected $registry;
// ----
public function __construct($registry) {
$this->registry = $registry;
}
public function __get($key) {
return $this->registry->get($key);
}
public function __set($key, $value) {
$this->registry->set($key, $value);
}
То есть при вызове какого-либо контроллера произойдет передача ему указателя на тот самый наш реестр, а при вызове магических методов __get() && __set() произойдет передача вызовов на реестр. Что это даст? Будет понятно на примере:
class SomeController extends Controller {
public function index() {
$this->load->model('...');
$this->config->get('param');
}
}
При вызове обоих аттрибутов класса на самом деле произел вызов из реестра. А уже в реестре, как мы видели ранее, хранится 2 компонента: config и load. Именно к ним идет обращение в данном случае (к объектам класса Config и Loader соответственно).
Точно так-же работает и модель: там, правда, обращение идет в основном к базе данных (компонент db), компоненту config, load. Но механизм работы у нее такой-же.
В этом и весь секрет работы реестра в opencart :)