Php OpenCart如何访问其库类?

Php OpenCart如何访问其库类?,php,opencart,Php,Opencart,我现在正在努力学习更多关于OpenCart的核心以及它的类是如何工作的。我也在努力提高我的OOP技能,因为我还在这方面学习,所以可能有一些我没有看到的东西 我想知道控制器文件如何知道如何找到cart类(例如) 例如 在catalog/controller/checkout cart中有(显然代码已删除) 控制器类可以在system/engine/Controller.php中找到 update()可以在system/library/cart中找到 我假设在controller.php中会有一个指

我现在正在努力学习更多关于OpenCart的核心以及它的类是如何工作的。我也在努力提高我的OOP技能,因为我还在这方面学习,所以可能有一些我没有看到的东西

我想知道控制器文件如何知道如何找到cart类(例如)

例如

在catalog/controller/checkout cart中有(显然代码已删除)

控制器类可以在system/engine/Controller.php中找到

update()
可以在system/library/cart中找到

我假设在controller.php中会有一个指向cart类的链接,或者由它生成的对象。(我是基于
$this->
的使用而得出的)

那么,如何从控制器中找到cart类呢


谢谢

ControllerCheckoutCart
扩展了
Controller
,这意味着它继承了
Controller
中您在这里没有看到的所有代码。
Controller
中的一些代码,可能在
Controller::\u construct
中,正在创建
$this->cart
对象。例如:

class Controller {

    public function __construct() {
        $this->cart = new Cart;
    }

}

由于此构造函数由所有子类继承,因此它们也构造自己的
$this->cart
,并通过自己的方法访问它。

首先,您的
控制器checkoutcart
扩展了
控制器
类,因此这是我们需要关注的类。您可以在
/system/engine/controller.php
中找到此类

在这个班里,有两个我们感兴趣。第一个是
\uuu构造
,其中加载了“registry”类(如果您有兴趣将其分开,可以在
/system/engine/registry.php中找到-这非常简单)

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

public function __construct($registry) {
    $this->registry = $registry;
}
第二个也是更重要的魔术方法是
\u get
方法。当一个classes属性不存在时,就会调用它,如果您希望这样做,您可以自己处理它。OpenCart使用它尝试从注册表中获取具有该项的类

public function __get($key) {
    return $this->registry->get($key);
}
因此,任何控制器中的
$this->cart
都会尝试从注册表中获取具有键
cart
的对象。如果您查看
index.php
文件,您将看到这是在那里分配的

// Cart
$registry->set('cart', new Cart($registry));

正如Jay Gilford所提到的,您需要在index.php和/或admin/index.php中注册新添加的库类文件(取决于您是在catalog还是在admin中使用它)

因此,在系统加载时,Opencart知道您的类存在,然后您可以通过以下方式调用其所有函数:

$this->yourlibraryfilename->function();
请注意,库文件名通常与类名相同,因此在这里的示例中使用它


在index.php文件中完成更改后,您需要注销并再次登录以查看更改。

感谢您的解释,不幸的是控制器中没有类似的内容,因此很可能在其他地方声明了类似的内容。不幸的是,在不了解OpenCart的情况下,这是不正确的。OpenCart使用某种服务提供者,而所有服务都需要注册到
$registry
。在控制器类中,当调用
$cart
时,它会弹出一个
加载程序
,从注册表中获取该注册类。IoC的一些简单实现。@shadyyx是的,
$this->cart
的具体实现方式肯定会有所不同。主要的一点是继承和
控制器包含的任何魔法代码。@MarkBaker-这实际上不是case@MarkBaker这是不正确的答案。OpenCart中根本没有使用Autoloader。谢谢,缺少的链接是
\uu get()
函数,您的帖子对此进行了很好的解释
$registry->set('yourlibraryclass', new YourLibraryClass());
$this->yourlibraryfilename->function();