Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356

Множественное наследование классов

08.11.2016, 11:03. Показов 4075. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одном классе нужно использование нескольких других классов.
допустим
class user , ему в помощь нужны классы Config && DataBase && AnotherClass.....
Собственно чем это правильно реализовать, передавать в конструктор объекты этих классов мне кажется не верным
Слышал|видел интерфейсы, но пока не вник в них и не понимаю как они помогают
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2016, 11:03
Ответы с готовыми решениями:

Множественное наследование и интерфейсы
Прочитал у книге, что с помощью интерфейсов можно реализовать множественное наследование(когда один класс наследует свойства, например, от...

Наследование классов в PHP
есть Class1, есть Class2 extends Class1 наследующий методы Class1, теперь появляется Class3, как заставить его унаследовать методы...

Наследование с нескольких классов
Есть два стандартных класса: 1 - это MOD и 2 - это cl_verificationInputData был написан еще 1 класс userConfig, наследую все методы и...

11
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
08.11.2016, 11:24
Цитата Сообщение от maruo Посмотреть сообщение
передавать в конструктор объекты этих классов мне кажется не верным
Вполне нормальное решение.

PHP
1
2
3
4
5
6
7
8
9
10
11
class Product_Service
{
    private $db;
    private $config;
 
    public function __construct(Database $db, Config $config)
    {
        $this->db = $db;
        $this->config = $config;
    }
}
Можно через сеттеры:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Article_Service
{
    private $db;
    private $config;
 
    public function setDb(Database $db)
    {
        $this->db = $db;
    }
 
    public function setConfig(Config $config)
    {
        $this->config = $config;
    }
}
Ещё есть IoC, его простыми словами не опишу Можете тут глянуть.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
08.11.2016, 11:30
трейты, как раз для решения этой проблемы придумали.
Цитата Сообщение от maruo Посмотреть сообщение
передавать в конструктор объекты этих классов мне кажется не верным
Так то это нормальная практика. Почитайте например это

Также про паттерны почитайте.
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
08.11.2016, 11:37
tarasalk, а чем трейты в данном случае могут помочь?
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
08.11.2016, 11:53
Jodah, я имел в виду трейты решают проблему отсутствующего в php множественного наследования. Другое дело что наследование класса User от Config, Database это весьма сомнительная идея.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
08.11.2016, 12:24  [ТС]
tarasalk, и в чем она сомнительна? Юзеру нужно работать с бд, юзеру нужны какие то статические данные из конфига
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.11.2016, 12:54
Цитата Сообщение от maruo Посмотреть сообщение
и в чем она сомнительна? Юзеру нужно работать с бд, юзеру нужны какие то статические данные из конфига
В том, что это не является отношением наследования. Юзер это не база данных. Юзер это не конфиг. Если нельзя сказать что A является B, то A не должен наследоваться от B, наследование должно лишь уточнять какие-то особенности поведения расширенного объекта, а не решать принципиально другую задачу. Ну и один из принципов OOD
Предпочитайте композицию наследованию
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
08.11.2016, 13:04  [ТС]
Jewbacabra, странно получается это все.
А если пользователю нужно соединение с бд, то откуда ему его брать если не наследовать его.
Или же в этом примере правильно будет не наследовать, а передать экземпляр объекта класса DataBase?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.11.2016, 13:08
Цитата Сообщение от maruo Посмотреть сообщение
А если пользователю нужно соединение с бд, то откуда ему его брать если не наследовать его.
Пользователь должен делегировать всю работу с бд тому, кто за это отвечает
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
08.11.2016, 13:57
Лучший ответ Сообщение было отмечено maruo как решение

Решение

Цитата Сообщение от maruo Посмотреть сообщение
А если пользователю нужно соединение с бд, то откуда ему его брать если не наследовать его.
Если вам нужен компьютер, вы покупаете компьютер, а не становитесь сами компьютером, верно?

Добавлено через 2 минуты
maruo,
PHP
1
2
3
4
5
6
7
8
9
10
11
class Controller
{
    public function action_index()
    {
        $computer = new Computer();
        $coffee = new Coffee('latte');
        
        $user = new User($computer, $coffee);
        $user->doWork();
    }
}
Мне кажется, здесь всё логично, никакого наследования юзера от кофе быть не должно.
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
08.11.2016, 14:34  [ТС]
Jodah, Откуда вы этот кусок кода стащили
У меня Аналогичный контроллер)
0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
10.11.2016, 20:18
Глобальные данные заменяются статиками. Последние лет 30 это уже считайте стандарт. Создаёте класс, можете назвать его App. У него должен быть статический метод getInstance() возвращающий экземпляр этого App. А у класса App есть паблик коннект и конфиг. Не нравится? Передавайте коннект и конфиг каждому объекту ваших классов, которым "требуется" множественное наследование.Выбирайте что проще. Проще тогда вообще на глобалах сидеть и не париться. Трейты сюда лепить - от нечего заняться. Это аналог шаблонов и макросов СИ и к ооп их отношение скорее декоративное..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2016, 20:18
Помогаю со студенческими работами здесь

Наследование классов в PHP
почему ничего не выводит?просто пустая страница. работает код который идет до класса. не пойму почему class A { function...

Множественное наследование классов
Здравствуйте! Пытаюсь работать с наследованием, а конкретно со множественным наследованием классов. Есть базовый класс млекопитающих...

Множественное наследование. Иерархия классов
Создать классы фигура, четырехугольник, квадрат и прямоугольник. Создать из них иерархию. Определить функции печати, конструкторы и...

Возведение в степень (множественное наследование классов)
Добрый день. В коде реализовано возведение в степень. Я совсем запутался в классах. Не могу понять почему при возведении, результат равен...

Задача на множественное наследование, иерархия классов
Создать класс хвост, имеющий в качестве параметров длину и вид(строка). Определить конструкторы и метод доступа. Создать класс хвостатое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru