Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
PHP: Помогите разобраться с абстрактными классами и интерфейсами
|
|||
|---|---|---|---|
|
#18+
Помогите разобраться с ООП в PHP, а то я уже совсем запутался. Есть задача создать платежный шлюз, для приема платежей от различных платежных агентов. Какие-то агенты работают интерактивно (платежи проводятся в реальном времени), какие-то работают с помощью реестров (с определенной периодичностью присылаются реестры платежей). Кроме того, у разных платежных агентов различные протоколы взаимодействия. Для того, чтобы была единообразная работа с различными платежными агентами и добавление нового платежного агента не было сложным, мне показалось оптимальным использовать паттерн Factory. Но когда дело дошло до его реализации, я вконец запутался с тем, что такое базовые классы, абстрактные классы и интерфейсы. Под спойлером наброски моего текущего кода. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. Вопросы такие. 1. Почему я не могу написать $af = new AgentFactory($db)->create("qiwi") ? Мне фабрика нужна для создания единственного объекта, более она мне не потребуется. 2. В текущей реализации базовый класс Agent у меня объявлен как абстрактный. Но я не совсем уверен, что он должен быть абстрактным. Не покажите пример на пальцах, что такое абстрактный класс, в каких случаях его нужно использовать? 3. В текущей реализации я передаю в объекты агентов ссылку на базу данных (чтобы объект вносил платежи в БД). Но такой подход мне не очень нравится. Я бы хотел сделать по другому — в объектах осуществляется обработка платежей и формируются данные для внесения платежей в БД (лицевой счет, сумма и т.п.), а непосредственно внесение платежей в БД происходит в одном месте (например в базовом классе Agent). Как это можно сделать? Реализовать в классе Agent этот метод и он будет унаследован всеми потомками? 4. Различные платежные агенты реализуют различные интерфейсы. А как мне проверить, что мой объект $agent поддерживает метод registry_recv и реализует интерфейс IAgentRegistry? Если для метода есть method_exists, то для интерфейса я ничего не нашел. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 18:42 |
|
||
|
PHP: Помогите разобраться с абстрактными классами и интерфейсами
|
|||
|---|---|---|---|
|
#18+
Alibek B., судя по вопросам, сначала нужно разобраться с ООП, а потом уже браться за написание таких вещей, активно использющих интерфейсы, абстрактные классы и т.д. налицо непонимание сущности интерфейсов. объяснять долго. прямой путь в доки и гугл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 18:55 |
|
||
|
PHP: Помогите разобраться с абстрактными классами и интерфейсами
|
|||
|---|---|---|---|
|
#18+
Alibek B., 1. Все, что справа от new -инструкция; 2.Абстрактный класс позволяет отложить реализацию метода. Если хоть один метод абстрактный, то и весь класс объявляется обстрактным. 3.Если в классе-родителе реализуешь метод, то он наследуется потомками. 4.instanceof или встроенное семейство классов Reflection Ваш класс Agent не является абстрактным. Чем отличается интерфейс от абстрактного класса: тем, что интерфейсе-одни методы, которые должны быть реализованы, а в абстрактном классе у вас может быть какой-то код. Теперь самое главное, для чего эта кухня нужна... Когда проект небольшой,вы работает один над ним, то нужды в принципе в этом нет. А вот когда задействованы архитектор(он определяет методы класса), несколько программистов(они занимаются реализацией)-вот тут и чувствуется преимущество данного подхода.Один из основных принципов ООП-программировать надо на основе интерфейсов,а не реализаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 19:57 |
|
||
|
PHP: Помогите разобраться с абстрактными классами и интерфейсами
|
|||
|---|---|---|---|
|
#18+
1. Понятно, особенности синтаксиса PHP. 2. А можно какой-нибудь практический пример, когда будет понятна разница между абстрактным классом и интерфейсом? В моем примере такой разницы не видно. Насколько я понял из примеров, разница в следующем: а) В интерфейсе объявляются только методы, в абстрактном классе можно объявлять и свойства. б) Объект может быть унаследован только от одного класса, зато интерфейсов может реализовывать несколько. в) В абстрактном классе помимо декларации метода можно сделать и его реализацию, то есть совместить базовый класс с интерфейсов и сэкономить на нескольких строках кода. Или различия более глубокие? 3. Я видимо неудачно выразился. Да, я могу в классе объект сделать метод payment() или свойство db и вызывать его из созданных в фабрике объектов. Но при этом метод/свойство будут доступны и внутри этих самых объектов, поскольку они унаследованы. А можно сделать так, чтобы $ai->payment() или $ai->db->query() работал, а $this->payment() или $this->db->query() внутри Agent_qiwi был недоступен? То есть я хочу сделать метод, которым можно пользоваться "снаружи" класса, но нельзя пользоваться "изнутри". 4. Да, instanceof подходит, спасибо. Не дочитал в документации, что он проверяет не только класс, но и интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 22:23 |
|
||
|
PHP: Помогите разобраться с абстрактными классами и интерфейсами
|
|||
|---|---|---|---|
|
#18+
Alibek B., " В абстрактном классе помимо декларации метода можно сделать и его реализацию," скорее одному методу можно сделать декларацию, а другому реализацию.. Хотя вам никто не запрещает реализованный метод переопределить в потомке "То есть я хочу сделать метод, которым можно пользоваться "снаружи" класса, но нельзя пользоваться "изнутри"." -обычно наоборот и для этого есть уровни доступа public protected и private ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 22:51 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38895028&tid=1461953]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 261ms |
| total: | 372ms |

| 0 / 0 |
