Расширение класса внешними методами и переменными

StalkerClasses

Новичок
Какие есть способы интегрировать в существующий класс методы и свойства из другого внешнего класса для последующего их использования при создании объекта?
 

StalkerClasses

Новичок
Да.

Код:
class Main {

      // Аннотоация для переменной
      protected $var;

      public function getVar(){
            return $this->var;
      }

      public function setVar($val){
            $this->var = $val;
      }

}

class MainEx {

      // Аннотоация для переменной
      protected $var2;

}
У меня есть базовый класс Main. И работать буду с ним. Но есть возможность как-то методы засунуть в него из класса MainEx. Что бы он как бы расширил его. Трейты мне подходят, т.к. классов MainEx может быть 1, 2 или 3. И не предполагается что будет меняться класс Main.
 

StalkerClasses

Новичок
Вот что то вроде такого, только мне нужно указать класс которые интегрировать.
PHP:
Product::addDynamicMethod('foo', function () {
    return 'bar';
});

$p = new Product();
$p->foo(); //'bar'
 

Adelf

Administrator
Команда форума
Неужели ему кто-то платит за его поделки?
 

Yoskaldyr

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

Adelf

Administrator
Команда форума
странно что еще не начал активно использовать go-aop. Практически все его хотелки связанные с наследованием как раз реализуются через такую магию...
мне кажется, он дает юзерам настраивать всякое для классов. Тут этим не поможешь.
 

nllabs

Новичок
Учитывая странные вопросы топикстартера, думаю, что он лепит свой код как получается, не задумываясь о последствиях и побочных эффектах.
Не задумываясь о том, как делать правильно и на какие грабли наступать.
 

StalkerClasses

Новичок
Так есть вариант решения такой задачи?
public $implement = [
'October.Rain.UtilityFunctions',
'October.Rain.DeferredBinding',
];
 
Последнее редактирование:

Yoskaldyr

"Спамер"
Партнер клуба
мне кажется, он дает юзерам настраивать всякое для классов. Тут этим не поможешь.
там можно все динамически настраивать через конфиги а не только через аннотации и любое извращение с наследованием будет работать (ну или практически любое).
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Не знаю, при чем тут aop, но тема расширения классов уже была, повторять скучно.
 

WMix

герр M:)ller
Партнер клуба
@StalkerClasses а почему ты не хочешь использовать MainEx?
или какой смысл писать классы (типы обьектов) если они тебе мешают?

Вот что то вроде такого
 

StalkerClasses

Новичок
@StalkerClasses а почему ты не хочешь использовать MainEx?
или какой смысл писать классы (типы обьектов) если они тебе мешают?


Можно пожалуйста Ваш пример.
 

25517

Новичок
@StalkerClasses,
Ещё вот такой пример есть.

Не совсем удачный, но логика работы понятна.
 

WMix

герр M:)ller
Партнер клуба
Можно пожалуйста Ваш пример.
этого достичь хочешь?
PHP:
interface B{
    public function foo();
}

interface C{
    public function bar();
}

class A implements B, C{
    public function foo(){
        return 'foo';
    }

    public function bar(){
        return 'bar';
    }
}

class D implemens B{
    public function foo(){
        return 'D foo';
    }
}

class E implemens C{
    public function bar(){
        return 'C bar';
    }
}


function x(B $b){
    echo $b->foo();
}

function y(C $c){
    echo $c->bar();
}


$a = new A();

x($a);
x(new D);
y($a);
y(new E);
 
Последнее редактирование:

StalkerClasses

Новичок
этого достичь хочешь?
PHP:
interface B{
    public function foo();
}

interface C{
    public function bar();
}

class A implements B, C{
    public function foo(){
        return 'foo';
    }

    public function bar(){
        return 'bar';
    }
}

class D implemens B{
    public function foo(){
        return 'D foo';
    }
}

class E implemens C{
    public function bar(){
        return 'C bar';
    }
}


function x(B $b){
    echo $b->foo();
}

function y(C $c){
    echo $c->bar();
}


$a = new A();

x($a);
x(new D);
y($a);
y(new E);

Нет. Я не могу заранее знать что имплементировать.
Есть базовый класс User.
Есть два, три или несколько расширений. В них есть классы:
UserExt1
UserExt2
UserExt3.

Вот из этих UserEx* нужно иметь доступ к их методам в классе User.
 

StalkerClasses

Новичок
@StalkerClasses,
Ещё вот такой пример есть.

Не совсем удачный, но логика работы понятна.
Это уже близко к теме.
 

StalkerClasses

Новичок
Здесь очень емко описана суть вопроса:

И у сторонних разработчиков возникает необходимость расширить класс ModuleUser, причем, один хочет изменить метод Init(), другой – метод GetRecord(), а третий – добавить своей логики в оба метода. И при этом надо обеспечить работоспособность всех трех расширений на любом сайте и в любой комбинации (т.е. где-то стоит одно расширение, где-то – другое, где-то – два из них, а где-то – и все три).

Итак, пусть сторонние разработчики независимо друг от друга пишут плагины, которые будут называться незатейливо First, Second и Third, и в каждом из них требуется класс-наследник от ModuleUser. В Alto CMS такие классы-наследники оформляются следующим образом:
 

StalkerClasses

Новичок
25517 Полагую это то что нужно. Но не совсем понял как в данном случае применяются class_alias() и в какой момент его нужно использовать.

По факту на данный момент у меня есть 4 класса. Class User, Class UserEx1, class UserEx2, class UserEx3.
 
Сверху