2015-04-19 3 views
4

Я новичок в PHP, я столкнулся с странной вещью для меня в opencart PHP engine.
Существует файл под названием catalog/controller/module/slideshow.php.
Этот класс расширяет класс ControllerConfused об использовании имени файла класса shortcode OpenCart

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 нет такого члена в этом классе, о, возможно, он находится в родительском классе.
Давайте проверим это, кд ....

<?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 

В этом случае следует указать ничего ....

Так много странных вещей для меня

Как это действительно работает. Как отображается ярлык для функции, почему функция не является статической и так далее.

Просьба пояснить это, буду благодарен за любую помощь.

EDIT

Если объект нагрузки имеет метод, который загружает модель в своем классе, где же объявлен метод загрузки, есть и это так и должно быть в одном классе.

ответ

6

Использование $this->model_design_banner не работает, потому что $this->load->model('design/banner'); не работает.

Это не удается, потому что вы перепутали «модель» и «модуль».

У вас есть файл модели в папке модуля:

catalog/module/design/banner.php

Это должно быть

catalog/model/design/banner.php

Вызов функции $this->load->model('design/banner'); пытается загрузить модель из конкретного места: " каталог/модель /design/banner.php ". Но он не может найти его в вашем случае, и поэтому «волшебный ярлык» не работает. Просто переместите файл в нужную папку. $this->model_design_banner->getBanner(); должен работать, когда модель найдена.

Как это работает внутри страны?

model() function ожидает файл модели с классом модели в определенной папке. Затем он загрузит этот файл (если он существует) и создаст экземпляр класса модели как свойство класса вашего текущего класса. Чтобы создать имя свойства класса, имя класса модели изменяется от ModelAAABBB до model_aaa_bbb, а это $this->model_aaa_bbb - для удобства использования. На самом деле это не документировано подробно (http://docs.opencart.com/developer/loading), но оно работает так, как это происходит внутри страны.

Посмотрите на Loader.php с моделью(): https://github.com/opencart/opencart/blob/master/upload/system/engine/loader.php#L15

Это статическая нагрузка файла в сочетании с шаблоном реестра и Волшебный доступом к свойству от контроллера. Существует «более простой», «немагический» способ: просто полагаться на автозагрузку. Это позволило бы использовать $model = new ModelDesignBanner(); непосредственно в контроллере. Автозагрузчик будет разрешать имя класса для имени файла через его классовую карту. Это действительно зависит ... и это дизайнерское решение основной команды OpenCart. Мне нравится подход к автозагрузке, потому что он не скрывает так много того, что происходит на самом деле. Это может быть медленнее по сравнению с прямым включением, если карта действительно большая.

Магия плохо - http://www.infoq.com/presentations/8-lines-code-refactoring

+0

К сожалению, это моя ошибка. Это работает, но я не понимаю, как это сделать. Пожалуйста, объясните это – cdxulkqy

+0

Я исправил свою ошибку, объясните, как это работает – cdxulkqy

+1

Я обновил свой ответ, чтобы объяснить, как работает загрузка модели. –