@wadowad

Как динамически подключить к class'у свойства и методы другого class'а или trait'а?

Всем доброго времени суток. Возможно ли как-то динамически связать один класс с другим? Базовых/родительских классов может быть несколько, подключаемых/дочерних классов/трейтов предполагается много. В родительском классе основная логика и базовые свойства, а также определяется имя подключаемого/дочернего трейта/класса. В подключаемом/дочернем трейте/классе дополнительные свойства и несколько методов, которые меняют поведение родительского класса. Так вот, есть ли какой-то способ в базовом классе подключить трейт или другой класс так, чтобы его свойства и методы были доступны из базового/родительского класса?

class Object {
  __construct($name) {
   use $name;
    //это вызовет ошибку, нужен какой-то аналог
  }
}

trait Name {
  public $x = 1;

  public function metod() {
    return 2;
  }
}

$object = new Object('Name');
echo $object->x;
echo $object->metod();


Либо может есть какой-то способ пойти в обратном порядке и динамически задавать имя родительского класса?

//Что-то вроде такого...
Name extends $object_name


Наверно я пытаюсь изобрести велосипед и есть более логичные способы.
  • Вопрос задан
  • 707 просмотров
Решения вопроса 1
@SharuPoNemnogu
не язык плохой, программисты такие...
из Name делаем класс, в Object внедряем его инстанс и дописываем методы __get и __call. Но это бредятина, лучше подумать над архитектурой.

class Object
{
    protected $di;

    public function __construct($di)
    {
        $this->di = $di;
    }

    public function __get(string $name)
    {
       if (property_exists($this->di, $name)) {
            return $this->di->$name;
        } else {
            throw new \Exception('бла бла');
        }
    }

    public function __call(string $name, array $arguments)
    {
        if (method_exists($this->di, $name)) {
            return $arguments ? $this->di->$name($arguments) : $this->di->$name();
        } else {
            throw new \Exception('бла бла');
        }
    }
}

class Name {
    public $x = 1;

    public function metod() {
        return 2;
    }
}

$object = new Object(new Name());
echo $object->x;
echo $object->metod();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
qonand
@qonand
Software Engineer
Как динамически подключить свойства и методы другого class'а или trait'а?

Средствами языка никак, да и изменение поведения/структуры объекта есть плохая практика, нарушающая принцип подстановки Барбары Лисков. Не до конца понимаю Вашу задачу, но порекомендовал бы посмотреть в сторону агрегации и композиции
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы