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