Как динамически подключить к 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
Наверно я пытаюсь изобрести велосипед и есть более логичные способы.

21 Авг 2019 в 07:01
156 +1
0
Ответы
1

Вы можете использовать магический метод __call для динамического вызова методов и свойств из подключаемого трейта или класса. Вот пример решения вашей проблемы:

trait Name {
public $x = 1;
public function metod() {
return 2;
}
}
class Object {
protected $trait;
public function __construct($name) {
$this->trait = new $name;
}
public function __call($method, $args) {
if (method_exists($this->trait, $method)) {
return call_user_func_array([$this->trait, $method], $args);
}
}
public function __get($property) {
if (property_exists($this->trait, $property)) {
return $this->trait->$property;
}
}
}
$object = new Object('Name');
echo $object->x; // Output: 1
echo $object->metod(); // Output: 2

В этом примере мы используем магические методы __call и __get для перенаправления вызовов методов и свойств к объекту, содержащему трейт или класс. Таким образом, вы можете динамически подключать трейты или классы к базовому классу и использовать их методы и свойства.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 956 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир