OpenCart如何访问其库类?

Adr*_*ian 4 php opencart

我目前正在尝试更多地了解OpenCart的核心以及它的类实际如何工作.我也试图提高我的OOP技能,因为我仍然在该领域学习,所以也许是我看不到的明显的东西.

我想知道控制器文件如何知道如何找到购物车类(例如).

例如

在目录/控制器/结帐车中有(显然删除了代码)

class ControllerCheckoutCart extends Controller {
    public function index() {
      $this->cart->update();
    }

}
Run Code Online (Sandbox Code Playgroud)

Controller类可以在system/engine/controller.php中找到

update() 可以找到系统/图书馆/购物车.

我假设在controller.php中会有一个指向购物车类的链接,或者是一个由它制作的对象.(我的基础是使用$this->).

那么如何从控制器中找到购物车类?

谢谢

Jay*_*ord 6

首先,你ControllerCheckoutCart扩展了Controller课程,所以这是我们需要关注的课程.你可以找到这个课程/system/engine/controller.php.

在这个类中,有两个我们感兴趣的魔术方法.第一个是__construct,因为在这里加载了一个"注册表"类(/system/engine/registry.php如果你有兴趣选择那个 - 它非常简单).

您可以将此视为对商店使用的所有类的查找,例如模型文件,库文件等.在构造中,注册表被传递给控制器​​,因此它具有对它的引用

public function __construct($registry) {
    $this->registry = $registry;
}
Run Code Online (Sandbox Code Playgroud)

第二个也是更重要的魔法是__get方法.当一个classes属性不存在时调用它,如果你愿意,你可以自己处理它.OpenCart使用它来尝试从注册表中获取具有该键的类

public function __get($key) {
    return $this->registry->get($key);
}
Run Code Online (Sandbox Code Playgroud)

所以$this->cart在任何控制器中都会尝试cart从注册表中获取带有密钥的对象.如果你查看index.php文件,你会看到它在那里分配

// Cart
$registry->set('cart', new Cart($registry));
Run Code Online (Sandbox Code Playgroud)