Расширение классов

StalkerClasses

Новичок
Есть какой-то класс
class base {
function 1()
function 2()
function 3()
}

Есть какие-то дополнительные классы:
class base_ex1(){
function 4()
}

class base_ex2(){
function 5()
}

Можно как-то работая с классами обращяться в классе base к методам function4 и function5().
Т.е. как бы дополнить класс base методами из классов ex_1 и ес_2?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
class base_ex1 extends base {}

class base_ex2 extends base_ex1 {}
 

Adelf

Administrator
Команда форума
Код:
class A {

private $ex1;

private $ex2;

public function __construct(Ex1 $ex1, Ex2 $ex2) {

  $this->ex1 = $ex1;

  $this->ex2 = $ex2;

}



function 1()

{

$this->ex1->4();

}

}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Кстати да, @Adelf прав. Я неправильно прочитал хотелку.

Как вариант - использовать трейты для base, но это так себе.
 

fixxxer

К.О.
Партнер клуба
Трейты - это, ну, такое. Очень редко, когда они по делу.
 

fixxxer

К.О.
Партнер клуба
Да, почти всегда так.
У меня есть один валидный кейс - собиралка евентов в domain models. Пихать это в abstract class Entity мне совсем не нравится - ну причем тут Entity?
 

Adelf

Administrator
Команда форума
Ну типа abstract class AggregateRoot. Если уж оно эвенты умеет собирать.

Можно даже abstract class AggregateRoot extends Entity
 

fixxxer

К.О.
Партнер клуба
Да можно и так, но мне не нравится.
Абстрактный класс - это все же is-a. Разве умение собирать события является тем, что в первую очередь характеризует AR? Что-то может вообще ни одного события не порождать, почему бы и нет. Это скорее из области can, уместен был бы интерфейс с default методом как в Java (на самом деле нет, потому что там нельзя свойство сделать, но все же какая-никакая аналогия), а трейты в качестве default interface implementation (где интерфейс - по классике, вида can) вполне себе норм.
 

StalkerClasses

Новичок
только прикрыть неудачную архитектуру :)
Поясню для чего мне это нужно.
У меня есть модель страниц - я создаю расширение и просто хочу в эту модель добавить несколько метдов. Т.к. по коду везде используется обращение к модели.
 

fixxxer

К.О.
Партнер клуба
есть такая штука правила (behaviors)
Нет, это говно.

Если возникает такая необходимость - значит, где-то есть существенная архитектурная проблема. (Наиболее очевидные случаи, RoR и Yii, - они все целиком являются одной большой архитектурной проблемой).
 

Yoskaldyr

"Спамер"
Партнер клуба
Судя по тексту первого поста необходимо из базового класса вызывать отдельные методы дочерних классов (несуществующие в базовом)
и это явно проблема в архитектуре (хотя скорее всего в понимании того что надо сделать)
 

StalkerClasses

Новичок
Судя по тексту первого поста необходимо из базового класса вызывать отдельные методы дочерних классов (несуществующие в базовом)
и это явно проблема в архитектуре (хотя скорее всего в понимании того что надо сделать)
Мне просто нужно дополнить модель определенными методами.
Отчасти да я согласен что это проблема с точки зрения архитектуры.

Но большинство CMS например имеют расширения.
Эти расширения в свою очередь могут иметь хуки.
 

Yoskaldyr

"Спамер"
Партнер клуба
Вызывать из родительского класса методы существующие как в родительском так и в дочернем - норм.
Вызывать из дочернего класса методы существующие только в дочернем - норм.
Но вызывать из родительского класса методы существующие только в дочернем - бред.
 

Adelf

Administrator
Команда форума
Скажи это Тэйлору :)

Код:
    /**
     * Determine if the request passes the authorization check.
     *
     * @return bool
     */
    protected function passesAuthorization()
    {
        if (method_exists($this, 'authorize')) {
            return $this->container->call([$this, 'authorize']);
        }

        return true;
    }
 

Yoskaldyr

"Спамер"
Партнер клуба
тоже мне авторитета нашел. Это же бред чистой воды
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нет, это говно.

Если возникает такая необходимость - значит, где-то есть существенная архитектурная проблема. (Наиболее очевидные случаи, RoR и Yii, - они все целиком являются одной большой архитектурной проблемой).
Я про именование, изначально это было под названием mixin. Я не про то, что это хорошо или плохо.
 
Сверху