Классы PHP: нужна помощь для наследования двух классов - PullRequest
3 голосов
/ 07 января 2009

Мне нужна помощь в разработке моих классов 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.

Спасибо!

Ответы [ 6 ]

8 голосов
/ 07 января 2009

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

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

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

2 голосов
/ 07 января 2009

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

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

1 голос
/ 07 января 2009

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

0 голосов
/ 07 января 2011

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

$john = new Staff('John');

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

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

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

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

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

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

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

0 голосов
/ 07 января 2009

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

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

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

0 голосов
/ 07 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...