За последние 24 часа нас посетили 64099 программистов и 1741 робот. Сейчас ищут 833 программиста ...

Наследование и передача параметров

Тема в разделе "PHP для профи", создана пользователем KDVMan, 7 дек 2016.

  1. KDVMan

    KDVMan Новичок

    С нами с:
    7 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    Всем привет,
    возник вопрос
    есть свой движок
    вот такая структура входа получается (используется автолоадер классов)

    идет запрос страницы,
    запускается скрипт index.php где прогружаются все нужные модули и прочее (у админки свой index.php, у самого сайта свой index.php),
    далее загружается класс Index (у админки свой Index, у сайта свой Index), который наследуется от класса Base, который в свою очередь наследуется от SuperBase (имена для примера привел)
    в классе SuperBase подгружаются нужные классы и переменные, которые используются на всем сайте,
    а вот классы Base разные, у админки свой Base, у самого сайта (тот что видят люди) свой Base - соответственно в каждом Base подгружаются свои методы и переменные
    в итогде в классе Index содержатся все необходимое для работы админки или сайта (в зависимости, где мы это дело вызываем)

    так вот, на данный момент у меня все работает так как написано выше и вот так как напишу далее:
    т.е. после того как в Index классе мы подгрузили все что нам надо, он (класс Index) загружает необходимый класс (в зависимости что мы запросили), ну например категории настроек в админке ссылка будет вида: index.php?module=settings&script=category (просто для примера)

    т.е. будет вызван класс Category из пространства имен Settings (ну не суть), в свою очередь этот Category наследуется так же от Base (в данном случае Base относится к админке) и по сути проиходят двойные вызовы всего, что есть в Base и в SuperBase

    так вот вопрос, я сейчас хочу переделать все это дело вот в таком варианте:
    ссылка все так же ведет на index.php?module=settings&script=category (просто для примера)
    подгружается как я написал выше Index класс, который в свою очередь наследуется и получает все необходимое и он вызывает класс Category из пространства имен Settings и передает в конструктор класса Category $this (пример: $class = new Category($this)) и в классе Category я уже в конструкторе делаю присвоение
    function __construct($context)
    {
    $this->context = $context;
    $this->db = $this->context->db;
    и т.д
    }

    но получается тут происходит дублирование переменных
    т.е. мне придется делать $this->что-то = $context->что-то для всех переменных, которые есть в Base и в SuperBase классах

    как избежать такого дубляжа? может быть вообще эта структура не верна в корне и кто-то сможет посоветовать как лучше сделать структуру?

    т.е. задача, что бы все мои классы, которые вызывает Index имели доступ к методам, которые загружаются в Base и SuperBase (там помимо своих методов, в них инициализируются другие классы, например в которых просто полезные функции, так вот к ним так же доступ нужен)

    заранее благодарю
    если что непонятно написал, задавайте вопросы, постараюсь расписать более подробно
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну а в чем проблема наследоваться-то? Вынесите все общее в одного предка, от него цепляйте все остальное.
     
  3. KDVMan

    KDVMan Новичок

    С нами с:
    7 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    проблема в том, что в Index классе - класс Category вызывается т.е.
    $class = new Category();

    и если я внутри класса Category опять буду наследоваться от Base, а Base класс в свою очередь от SuperBase то по сути те методы что есть в Base и SuperBase будут еще раз дергаться (а там может например быть обращение к базе данных), т.е. по сути двойной вызов будет, сначала в Index потом в Category
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Вам сюда
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Сядьте, выпишите для себя схему этих классов, прям на листочке, и подумайте, как разнести по родителям повторяющиеся функции.
    Есть такое правило - если у вас случилось ромбовидное наследование, значит у вас что-то не так в архитектуре.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Интерфейсы рулят. Всякий раз когда хочется множественного наследования, вспоминай про интерфейсы.

    Из описания не понятна выгода наследования от этих супер-классов. За что боремся?

    В терминах MVC эта твоя иерархия относится к контроллерам или к моделям?
     
    #6 artoodetoo, 8 дек 2016
    Последнее редактирование: 13 дек 2016
  7. KDVMan

    KDVMan Новичок

    С нами с:
    7 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    мне не нужно делать за меня, мне нужен совет

    ромба вроде как нет

    множественного наследования как такового нет, есть наследование для класса в зависимости где вызываем (на сайте или в админке), нужно это для того, что бы всегда под рукой (без дополнительного объявления) были все классы (методы) для работы (которые нужны везде и всегда), что бы не вызывать из каждый раз в каждом классе (а объявил один раз и пользуйся)
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну так сделайте что-то вроде "библиотеки". Пусть подключается как статика и предоставляет набор этих функций.
     
  9. KDVMan

    KDVMan Новичок

    С нами с:
    7 дек 2016
    Сообщения:
    4
    Симпатии:
    0
    ок спасибо, буду пробовать :)
     
  10. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    раз настроенный phpDocumentor избавит вас от этих проблем, научит писать документированный и понятный код. Он строит диаграммы классов и создает документацию автоматически
     
    Fell-x27 нравится это.
  11. valentinnew

    valentinnew Активный пользователь

    С нами с:
    30 янв 2011
    Сообщения:
    161
    Симпатии:
    36
    совет: прежде чем писать свои фреймворки, нужно посмотреть на то, как реализованы существующие. Ведь их делали не один десяток умных дядек и не с первого раза. это раз.
    два: у тебя index.php это по сути точка входа, а в параметрах ты передаешь то, что ты хочешь получить. Так вот, вынеси в index.php только тот функционал, который отвечает именно за загрузку нужного класса (module, script), а все модули и скрипты наследуй от отдельного родителя, в которых только тот функционал, который отвечает за логику и отображения конкретного модуля и скрипта.
    Даже если ты просто загружает index.php без параметров, то и в этом случае нужно будет загружать дефолтный модуль и скрипт.

    А если есть функционал, который используется во многих модулях и скиптах, то есть статические классы(хелперы) и trait-ы
    --- Добавлено ---
    множественное наследование в пхп, это трэйты. Интерфейсы для другого.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Ну да, согласен. Интерфесы задают только интерфейс (как бы глупо это ни звучало), а трейты описывают реализацию.
    --- Добавлено ---
    И тем не менее, всякий раз когда хочется множественного наследования, вспоминай про интерфейсы. ;)
     
    [vs] нравится это.