Laravel — Неустранимая ошибка: не была применена подписка на метод признака

#php #laravel #traits

#php #laravel #Трейты

Вопрос:

вот сценарий кода, с которым я столкнулся, и я попытался решить его, указав имя моего класса для методов признака, но проблема все еще существует. что мне делать?

 trait Billable{
    public function subscription(){
    }
}
trait Plan{
    public function subscription(){
    }
}
class User {
    use Billable, Plan{
        Billable::subscription as public billAbleSubscription;
        Plan::subscription as public planAbleSubscription;
    }
}
$obj = new User();
  

Я хочу, чтобы у пользователя были оба метода с одинаковым именем, но разной функциональностью. возможен ли какой-либо способ?

Ответ №1:

У вас конфликт. Вы можете использовать PHP для разрешения конфликтов:

Если два признака вставляют метод с одинаковым именем, возникает неустранимая ошибка, если конфликт явно не разрешен.

Чтобы разрешить конфликты именования между признаками, используемыми в одном классе, необходимо использовать оператор insteadof для выбора именно одного из конфликтующих методов.

В руководстве приведен немного запутанный пример с использованием insteadof оператора, а ЗАТЕМ псевдоним с использованием as оператора, как вы пробовали выше, как скопировано ниже:

 trait A {
public function smallTalk() {
    echo 'a';
}
public function bigTalk() {
    echo 'A';
}
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;

        B::bigTalk as talk;       // <------
    }
}
  

Я думаю, вы были почти на месте, и, честно говоря, ваш подход выглядит для меня абсолютно логичным, но, возможно, синтаксис должен включать insteadof оператор и немного больше кода, как в приведенном выше примере. Попробуйте это — HTH

Ответ №2:

мы должны дать имена каждому конфликтующему методу, и мы должны определить, что если мы будем вызывать метод по его первоначальному имени, то будет вызван метод, из которого будет вызван признак. итак, вот полный решаемый код.

 trait Billable{

    public function subscription(){

        echo "billable subscription. 
";
    }
}

trait Plan{
    public function subscription(){

        echo "plan subscription. 
";

    }

}

class User {

    use Billable, Plan{

        Billable::subscription as public billAbleSubscription;
        Plan::subscription insteadof Billable;
        Plan::subscription as public planAbleSubscription;

    }
}

$obj = new User();

$obj->billAbleSubscription();
$obj->planAbleSubscription();
$obj->subscription();