#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();