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

时间:2015-04-19 09:29:10

标签: 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']);
.....

Hm $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

在这种情况下应该指向什么......

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

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

请解释一下,我将不胜感激任何帮助。

修改

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

1 个答案:

答案 0 :(得分:4)

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

它失败了,因为你混淆了&#34;模特&#34;和&#34;模块&#34;。

模块文件夹中有模型文件:

catalog/module/design/banner.php

这应该是

catalog/model/design/banner.php

函数调用$this->load->model('design/banner');尝试从特定位置加载模型:&#34; catalog / model /design/banner.php"。但它无法在你的情况下找到它,所以&#34;魔术捷径&#34;不管用。只需将文件移动到正确的文件夹即可。找到模型时,$this->model_design_banner->getBanner();应该有效。

这在内部如何运作?

model() function期望模型文件在某个文件夹中具有模型类。然后它将加载此文件(如果存在)并将模型类实例化为当前类的类属性。要构建类属性的名称,模型类的名称将从ModelAAABBB修改为model_aaa_bbb以及$this->model_aaa_bbb - 以便于使用。这并没有真正记录在深度(http://docs.opencart.com/developer/loading),但它在内部工作如此。

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

查看Loader.php

这是静态文件加载,结合来自Controller的Registry Pattern和Magic属性访问。有一个&#34;更容易&#34;,#34;非魔术&#34;方式:简单地依靠自动加载。这样就可以直接在控制器中使用$model = new ModelDesignBanner();。自动加载器会通过它的类映射将类名解析为filename。这实际上取决于......而且它是OpenCart核心团队的设计决策。我更喜欢自动加载方法,因为它并没有隐藏真正发生的事情。如果地图真的很大,那么与直接包含相比可能会更慢。

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