Классы PHP: нужна помощь для наследования двух классов

Мне нужна помощь в разработке моих PHP-классов, в которых мне нужно расширяться от нескольких классов.

У меня есть общий класс Pagination.php, который выполняет все виды разбивки на страницы и сортировку. Все остальные классы будут использовать это для нумерации страниц.

Чтобы облегчить себе жизнь, я сделал генератор классов, который генерирует класс из таблицы MySQL. Все свойства, геттеры, сеттеры и общие методы создаются автоматически, что действительно экономит время и деньги.

Например, класс Staff_Base в Staff_Base.php автоматически генерируется из таблицы SQL t_staff.

Поскольку класс Staff_Base автоматически создается из таблицы SQL, любые «настраиваемые» методы / свойства находятся в другом классе, который расширяет Staff_Base.php. (Так что всякий раз, когда добавляется новое поле, я могу просто регенерировать класс Staff_Base и перезаписывать его в Staff_Base.php).

Итак, у меня есть класс Staff.php, который расширяет Staff_Base.php.

Проблема в том, что Staff.php также должен расширять другой класс, Pagination.php. (Текущий обходной путь - поместить методы в Pagination.php в каждый класс. Это действительно неприятно, когда я вношу изменения в методы разбивки на страницы / сортировки.)

Как мне это сделать? Какой шаблон проектирования лучше всего подходит для этого?

Я знаю общие предложения по реструктуризации моих классов, но я действительно много думаю о другом обходном пути / решении. Кроме того, мне может потребоваться расширить другие классы, кроме Pagination.php.

Спасибо!

Персонал "это - пагинация"? Похоже, он должен просто использовать объект Pagination, а не расширять его.

Lotus Notes 30.06.2010 21:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
3 194
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

вы не можете, множественное наследование не поддерживается в php, но если вы выполните поиск в Google по этой теме, вы можете найти некоторые обходные пути ...

Просто сказать кому-то в Google, что это не так уж и полезно, особенно если спрашивающий конкретно просит совета о том, как реструктурировать вещи, и ясно показал, что он осведомлен о проблемах с тем направлением, в котором он сейчас думает.

kander 07.01.2011 01:09

Возможно, вы уже знаете, что PHP не поддерживает множественное наследование. Один из способов - использовать интерфейсы вместо суперклассов, хотя, если логика идентична для каждой реализации интерфейса, это может стать утомительным. Как насчет написания генератора кода, который просто внедряет методы в каждый класс? Кажется, вы уже делаете это «обычными методами».

Да, и использование геттеров и сеттеров (как они используются, например, в Java) в PHP считается не очень хорошей идеей. Объекты сами по себе медленные, поэтому использование общедоступных полей считается нормой.

Редактировать: Затем есть __вызов()-hack, который может распознавать методы, которые фактически находятся в других ваших классах, и вызывать их вручную.

Есть ли у вас исходники для публичных полей - это норма? Я думаю, что любой, кто пытается серьезно практиковать ООП в PHP, использует геттеры / сеттеры. В противном случае вы не сможете должным образом обеспечить правильность внутреннего состояния ваших объектов, верно?

kander 07.01.2011 01:08

Можете ли вы унаследовать ваш сгенерированный класс Staff_Base от Pagination? Или Staff_Base уже наследуется от другого базового класса (который вы не контролируете) ...

Похоже на Doctrine или Propel, я не помню, где используется система классов * _Base.

Мое предложение заключалось в том, чтобы переписать разбиение на страницы, чтобы оно могло использоваться вашими классами сущностей, вместо того, чтобы требовать от ваших классов сущностей расширять ее.

Просто толчок: только что выпущенный Doctrine2 больше не имеет требований к базовому классу. Однако это полная переработка, отбрасывающая некоторые из худших идей Doctrine.

kander 07.01.2011 01:06
Ответ принят как подходящий

Я бы порекомендовал изменить ваш генератор Staff_Base.php, чтобы этот класс по умолчанию расширял разбиение на страницы. Таким образом, Staff расширяет Staff_Base, а Staff_Base расширяет Pagination. Я думаю, что это, вероятно, самый чистый (и наиболее объектно-ориентированный) способ получения желаемых результатов.

Итак, если я правильно читаю то, что вы написали, поскольку вы не можете наследовать от 2 классов, вы дублируете разбиение на страницы в каждом классе, который у вас есть.

Укладка классов - это решение. Одним из первых дел я гуглил.

Похоже, вы тут все смешиваете. Класс (например, класс Staff) используется для представления единой сущности. Например:

$john = new Staff('John');

Как именно подкачка в это вписывается? Возможность страниц (разбиение на страницы?) Звучит как свойство того, что разрешает доступ к этим объектам Staff, а не самой сущности. Таким образом, будет понятен способ наследования каждого типа класса Staff, который вы создаете, от базового класса.

Итак, я считаю, что вам нужно:

  1. Класс Staff (Staff_Base и его дочерний граф)
  2. Объект доступа к данным персонала (DAO \ Staff было бы хорошим названием, если вы используете пространства имен)
  3. Интерфейс, чтобы сообщить миру, что DAO может быть выгружен на страницы

Следует отметить, что нет прямого наследования между классом DAO и классом Staff. Вы по-прежнему можете сгенерировать класс Staff_Base на основе его свойств в базе данных и расширить оттуда ... до тех пор, пока вы не включите фактический доступ к данным в этом классе.

Тогда код, использующий это, будет выглядеть примерно так:

 <?php
 $staffDao = new DAO\Staff;
 $staffMembers = $staffDao->getPagedResult($start, $amount);
 ?>

Отредактировано, чтобы подчеркнуть, что структура наследования должна быть отделена от фактического извлечения.

Другие вопросы по теме