Php, методы коллизии с цепным вызовом (magic) в чертах, как это сделать?

#php #traits

#php #Трейты

Вопрос:

 trait A
{
    function __get($name)
    {
    }
}

trait B
{
    function __get($name)
    {
    }
}

trait C
{
    function __get($name)
    {
    }
}

class D
{
    use A, B, C;

    function __get($name)
    {
        // it may also have magic method
    }
}
  

Я хочу вызвать все 4 __get() метода, это выполнимо? Я вижу, что могу переименовывать методы, но это скорее выбор метода из A, B, C, но мне нужны все из них

Ответ №1:

Невозможно без переименования импортированных __get методов.

Смотрите документы PHP по этому вопросу: PHP: Черты — разрешение конфликтов

 class D
{
    use A, B, C {
        A::__get as private __getA;
        B::__get as private __getB;
        C::__get as private __getC;
    }

    function __get($name)
    {
        $this->__getA($name);
        $this->__getB($name);
        $this->__getC($name);
    }
}
  

(Я переименовал класс в D, поскольку у вас не может быть признака и класса с одинаковым именем в одном пространстве имен.)

Комментарии:

1. @JohnSmith Хотя этот ответ технически верен и позволит вам делать то, что вы хотите, я не совсем уверен в том, насколько хороша идея, лежащая в основе. Вам действительно нужно иметь так много магических методов, распределенных по стольким классам? Это значительно усложнит понимание базовой логики вашего кода и, скорее всего, станет прямой причиной множества ошибок.