Я новичок в платформе Oxid, которая широко использует прозрачные родительские классы для расширения базового класса. Я не вижу преимущества этой техники. Так что мне любопытно, это шаблон? Где преимущества?
Ура,
Kathrin
Пример кода:
\\ a class by the framework I like to extend
class A { ... }
Чем распространенный способ расширения этого класса с помощью Framework:
class B extend class B_parent
Где B_parent — класс, созданный платформой через файл конфигурации, который выглядит следующим образом:
'extend' => array(
'A' => 'path_to/B')
Это не конкретный известный шаблон проектирования, это функциональность, созданная специально для оксидов. Классы в Oxid создаются не с «новым», а с помощью фабрики, например, Oxnew («Oxarticle»). Если для oxarticle нет зарегистрированных модулей, фабрика просто возвращает экземпляр oxarticle.
Когда модуль зарегистрировал «myOxarticle» как расширение для oxarticle, oxnew («oxarticle») вернет экземпляр myOxarticle, а myOxarticle будет вытянут из оксартикулы. Эта цепочка классов построена на заводе. Это первое преимущество, представьте, что вы использовали «myOxarticle extends oxarticle», вам придется изменить все места, где используется oxarticle, чтобы ваш объект использовался вместо oxarticle. Теперь с прозрачной цепочкой классов, фабрика позаботится об этом, ваши новые функциональные возможности теперь используются везде, где используется объект из оксичастиц. Местам, которые называют oxnew («oxarticle»), не нужно знать о вашем новом объекте.
Вторым преимуществом является наличие нескольких модулей, расширяющих один и тот же класс Oxid и даже один и тот же метод. Фабрика создает цепочку классов в фоновом режиме, и oxnew («oxarticle») возвращает экземпляр последнего класса в цепочке. Хорошей практикой является то, что если вы расширяете класс, вы вызываете родительский метод во всех ваших методах. Таким образом, каждый метод всех классов модулей выполняется, если вызывается определенный метод базового класса, и каждому из модулей не нужно знать о других модулях.
Другим способом расширения функциональности может быть использование хуков или фильтров. Недостаток крючков состоит в том, что они должны быть встроены в каждый способ, который может быть расширен, и даже тогда оксидный способ более гибок.
Могут быть некоторые причины, которые мешают вам вызывать родительский метод в ваших методах класса, например, если родительский метод делает что-то, чего вы не хотите делать. В этом случае это нарушает независимость между модулями и должно быть сделано только в том случае, если нет другого способа.
Если вы не хотите изменять существующее поведение, а хотите создать свой собственный класс, который используется только вашим модулем, например, новым контроллером страницы, в метаданных есть массив «files», который регистрирует ваш класс только в автозагрузчик, в этом случае вы должны использовать, например, «mycontroller extends oxubase», а не «mycontroller extends mycontroller_parent».
OXID использует этот способ обработки расширений классов, потому что он может объединять несколько расширений для одного класса без разрыва цепочки наследования.
например у вас есть два модуля, которые расширяют один и тот же классstart
«(для стартовой страницы магазина)
если оба модуля будут использовать class myStart extends start
а также myOtherStart extends start
они бы наследовали только от start
и не иметь дополнительных функций или изменений от другого расширения. Таким образом, вы не можете использовать оба модуля одновременно.
Используя class myStart extends myStart_parent
а также myOtherStart extends myOtherStart _parent
вместе с отображением расширений в metadata.php OXID может динамически объединять все изменения для одного и того же класса в один отдельный класс.
1) start
это родительский класс
2) myStart
будет применяться к start
3) myOtherStart
будет применяться к myStart
в конце этой цепочки наследования вы получаете один единственный класс с функциями всех расширений классов
ура!