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






вы не можете, множественное наследование не поддерживается в php, но если вы выполните поиск в Google по этой теме, вы можете найти некоторые обходные пути ...
Просто сказать кому-то в Google, что это не так уж и полезно, особенно если спрашивающий конкретно просит совета о том, как реструктурировать вещи, и ясно показал, что он осведомлен о проблемах с тем направлением, в котором он сейчас думает.
Возможно, вы уже знаете, что PHP не поддерживает множественное наследование. Один из способов - использовать интерфейсы вместо суперклассов, хотя, если логика идентична для каждой реализации интерфейса, это может стать утомительным. Как насчет написания генератора кода, который просто внедряет методы в каждый класс? Кажется, вы уже делаете это «обычными методами».
Да, и использование геттеров и сеттеров (как они используются, например, в Java) в PHP считается не очень хорошей идеей. Объекты сами по себе медленные, поэтому использование общедоступных полей считается нормой.
Редактировать: Затем есть __вызов()-hack, который может распознавать методы, которые фактически находятся в других ваших классах, и вызывать их вручную.
Есть ли у вас исходники для публичных полей - это норма? Я думаю, что любой, кто пытается серьезно практиковать ООП в PHP, использует геттеры / сеттеры. В противном случае вы не сможете должным образом обеспечить правильность внутреннего состояния ваших объектов, верно?
Можете ли вы унаследовать ваш сгенерированный класс Staff_Base от Pagination? Или Staff_Base уже наследуется от другого базового класса (который вы не контролируете) ...
Похоже на Doctrine или Propel, я не помню, где используется система классов * _Base.
Мое предложение заключалось в том, чтобы переписать разбиение на страницы, чтобы оно могло использоваться вашими классами сущностей, вместо того, чтобы требовать от ваших классов сущностей расширять ее.
Просто толчок: только что выпущенный Doctrine2 больше не имеет требований к базовому классу. Однако это полная переработка, отбрасывающая некоторые из худших идей Doctrine.
Я бы порекомендовал изменить ваш генератор Staff_Base.php, чтобы этот класс по умолчанию расширял разбиение на страницы. Таким образом, Staff расширяет Staff_Base, а Staff_Base расширяет Pagination. Я думаю, что это, вероятно, самый чистый (и наиболее объектно-ориентированный) способ получения желаемых результатов.
Итак, если я правильно читаю то, что вы написали, поскольку вы не можете наследовать от 2 классов, вы дублируете разбиение на страницы в каждом классе, который у вас есть.
Укладка классов - это решение. Одним из первых дел я гуглил.
Похоже, вы тут все смешиваете. Класс (например, класс Staff) используется для представления единой сущности. Например:
$john = new Staff('John');
Как именно подкачка в это вписывается? Возможность страниц (разбиение на страницы?) Звучит как свойство того, что разрешает доступ к этим объектам Staff, а не самой сущности. Таким образом, будет понятен способ наследования каждого типа класса Staff, который вы создаете, от базового класса.
Итак, я считаю, что вам нужно:
Следует отметить, что нет прямого наследования между классом DAO и классом Staff. Вы по-прежнему можете сгенерировать класс Staff_Base на основе его свойств в базе данных и расширить оттуда ... до тех пор, пока вы не включите фактический доступ к данным в этом классе.
Тогда код, использующий это, будет выглядеть примерно так:
<?php
$staffDao = new DAO\Staff;
$staffMembers = $staffDao->getPagedResult($start, $amount);
?>
Отредактировано, чтобы подчеркнуть, что структура наследования должна быть отделена от фактического извлечения.
Персонал "это - пагинация"? Похоже, он должен просто использовать объект Pagination, а не расширять его.