Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Условное наследование
Форумы портала PHP.SU » PHP » Программирование на PHP » Условное наследование

Страниц (1): [1]
 

1. Мелкий - 25 Января, 2010 - 12:24:31 - перейти к сообщению
Кусок кода, он работает, и класс наследуется от разных родителей в зависимости от условия.
Но вот на сколько это корректно?

PHP:
скопировать код в буфер обмена
  1. class a {
  2.         public $a="родитель, класс a";
  3.         }
  4. class b {
  5.         public $b="родитель, класс b";
  6.         }
  7. if (false) {
  8.         class c extends a {
  9.                 public $c="класс c, наследник a";
  10.                 }
  11.         } else {
  12.         class c extends b {
  13.                 public $c="класс c, наследник b";
  14.                 }
  15.         }
  16. $cl = new c();
  17. echo $cl->c;


PS: нужно для каскадного наследования с некоторыми различиями в 2х классах из 4х
2. valenok - 25 Января, 2010 - 13:19:54 - перейти к сообщению
Полагаю что раз работает и не жалуется, то можно считать корректным.
3. JustUserR - 25 Января, 2010 - 13:20:44 - перейти к сообщению
Мелкий пишет:
Но вот на сколько это корректно?
Фактически правильно но обычно для таких целей используют динамический полиформизм на основе виртуальных функций Улыбка
4. Мелкий - 25 Января, 2010 - 13:38:37 - перейти к сообщению
JustUserR пишет:
динамический полиморфизм на основе виртуальных функций

так, а ещё раз? Радость
По отдельности все слова знаю (хоть и в контексте С++), а вот как это выглядит всё вместе?
5. Stierus - 25 Января, 2010 - 15:44:07 - перейти к сообщению
В данном примере смысл мне не понятен ... вы сделали наследование, но понятия не имеете, можно ли обратиться к $cl->a b $cl->b ... в каком-то случае будет а, в каком-то b ...
6. EuGen - 25 Января, 2010 - 15:56:58 - перейти к сообщению
Если только a не совпадает по имени с b. Тогда в зависимости от разных условий мы будем иметь разную реализацию метода a. (Это имеет хоть какой-то смысл)
7. Мелкий - 25 Января, 2010 - 16:12:09 - перейти к сообщению
Stierus, ну это только пример для демонстрации что именно подразумевается под условным наследованием. А имена будут одинаковые у сходных функций, как и предположил EuGen.

Реально планируются такие классы (система заявок на изменение данных на сайте):
base - базовые данные и методы, общие и для пользователей и для разный типов заявок
base_adm и base_user - специфичные поведения общих данных для разных групп пользователей
news - наследуется от base_adm или base_user в зависимости от полномочий, и указывает данные, характерные для таких заявок
news_adm и news_user - специфичные методы для таких заявок, зависящие от полномочий
Аналогично с news* ещё несколько классов.
8. JustUserR - 25 Января, 2010 - 16:38:59 - перейти к сообщению
Мелкий пишет:
Так, а ещё раз? По отдельности все слова знаю (хоть и в контексте С++), а вот как это выглядит всё вместе?
На PHP тоже имеется возможность в классе сделать функцию которая будет определена во время выполнения
Учитывая что PHP язык динамический то можно создать ее прямо на ходу - можете почитать здесь http://habrahabr[dot]ru/blogs/php/30126/
9. Stierus - 25 Января, 2010 - 17:03:35 - перейти к сообщению
Почитай про паттерны проектирования ... как то factory, builder, adapter и тд - там много интересного Улыбка
10. Мелкий - 25 Января, 2010 - 17:30:48 - перейти к сообщению
О, иду читать умные мысли! Благодарю!
11. EuGen - 25 Января, 2010 - 17:39:58 - перейти к сообщению
Stierus пишет:
про паттерны проектирования

Верная мысль. Вряд ли тогда такие задачи будут вставать.
12. JustUserR - 25 Января, 2010 - 18:07:00 - перейти к сообщению
Stierus пишет:
Про паттерны проектирования
Использование сандартных парадигм программирования и подходов конечно важно при проектировании реальных и особенно больших проектов
Однако часто людям бывает интересно можно ли сделать вот то - а и говорят что для этой задачи есть только другой подход Вот пример - если вы спросите на форуме по C/C++ как узнать размер создаваемого массива то вам скажут что никак и посоветуют использовать STL - но на самом деле-то узнать размер массива можно причем несколькими способами Та же история и с преобразование указателей которые нельзя преобразовывать и тд
Поэтому я за то чтобы не скрывать нестандартные подходы и рассказать про них - при этом настоятельно порекомендовав использовать в настоящих проектах что-то пообщеупотребительнее

 

Powered by ExBB FM 1.0 RC1