php - 对使用类文件名快捷方式 OpenCart 感到困惑

标签 php opencart opencart2.x

我是 PHP 新手,我在 opencart PHP 引擎中遇到了奇怪的事情。
有一个名为catalog/controller/module/slideshow.php的文件。
该类扩展了Controller

class ControllerModuleSlideshow extends Controller {
        protected function index($setting) {
                static $module = 0;

                $this->load->model('design/banner');
                $this->load->model('tool/image');
.....
                 $this->model_design_banner->getBanner($setting['banner_id']);
.....

$this->model_design_banner 这个类中没有这个成员,哦,可能是在父类中。
让我们检查一下,cd....

<?php
abstract class Controller {
        protected $registry;
        protected $id;
        protected $layout;
        protected $template;
        protected $children = array();
        protected $data = array();
        protected $output;

嗯....??!!! WTF(对不起)

这个类中也没有这样的成员......

我猜这是catalog/controller/module/banner.php

的快捷方式

//这里有很多问题如何,在哪里?

让我们打开catalog/model/design/banner.php

<?php
class ModelDesignBanner extends Model {
        public function getBanner($banner_id) {
                $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "banner_image bi LEFT JOIN " . DB_PREFIX . "banner_image_description bid ON (bi.banner_image_id  = bid.banner_image_id) WHERE bi.banner_id = '" . (int)$banner_id . "' AND bid.language_id = '" . (int)$this->config->get('config_language_id') . "'");

                return $query->rows;
        }
}

好吧,没有之前的问题,它看起来很正常......停止!

如果我们可以调用方法快捷方式,它应该是静态的......。

$this->db->query

在这种情况下应该没有指向任何内容....

对我来说有很多奇怪的事情

这到底是如何运作的。快捷方式如何映射到函数,为什么函数不是静态的等等。

请解释一下,我将不胜感激。

编辑

如果加载对象有在我的类中加载模型的方法,其中声明了加载方法,那么也有这个,所以它应该在同一个类中。

最佳答案

使用 $this->model_design_banner 失败,因为 $this->load->model('design/banner'); 失败。

它失败了,因为你混淆了“模型”和“模块”。

您的模块文件夹中有一个模型文件:

catalog/module/design/banner.php

这应该是

catalog/model/design/banner.php

函数调用 $this->load->model('design/banner'); 尝试从特定位置加载模型:“catalog/model/design/banner.php”。但它在你的情况下找不到它,所以“神奇的快捷方式”不起作用。只需将文件移动到正确的文件夹即可。当找到模型时, $this->model_design_banner->getBanner(); 应该可以工作。

这在内部是如何运作的?

model() function需要特定文件夹中包含模型类的模型文件。然后它将加载该文件(如果存在)并将模型类实例化为当前类的类属性。为了构建类属性的名称,模型类的名称从 ModelAAABBB 修改为 model_aaa_bbb ,即 $this->model_aaa_bbb -以便于使用。这并没有真正深入记录( http://docs.opencart.com/developer/loading ),但它在内部是这样工作的。

用 model() 看一下 Loader.php:https://github.com/opencart/opencart/blob/master/upload/system/engine/loader.php#L15

这是静态文件加载,与来自 Controller 的注册表模式和 Magic 属性访问相结合。有一种“更简单”、“非魔法”的方法:简单地依赖自动加载。这将允许直接在 Controller 中使用 $model = new ModelDesignBanner(); 。自动加载器将通过其类映射将类名解析为文件名。这确实取决于……并且这是 OpenCart 核心团队的设计决策。我更喜欢自动加载方法,因为它不会隐藏太多真正发生的事情。如果 map 真的很大,它可能比直接包含要慢。

魔法不好 - http://www.infoq.com/presentations/8-lines-code-refactoring

关于php - 对使用类文件名快捷方式 OpenCart 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29728079/

相关文章:

php - 编码 php postgres json_encode

php - 将带有 SELECT 结果的变量组合到 INSERT 语句中

php - opencart获取所有可下载文件

php - 为 OpenCart 创建开发环境

php - opencart编辑download.php报错

php - 如何在购物车中传递自定义变量?

java - 为网站创建 API

php - SQL SELECT 与联合子查询的连接返回空和多个结果

mysql - 是否可以获取页面上调用的所有mysql查询?

打开购物车 "You do not have permission to access this page, please refer to your system administrator"