Laravel - 致命错误:尚未应用特征方法订阅

问题描述 投票:0回答:2

这是我面临的一个代码场景,我试图通过为我的类提供特征方法的名称来解决它,但问题仍然存在。我该怎么办?

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

我想向用户提供两个名称相同但功能不同的方法。有什么办法吗?

php laravel traits
2个回答
1
投票

你有冲突。你可以使用PHP Conflict Resolution

如果两个Traits插入具有相同名称的方法,则在未明确解决冲突时会产生致命错误。

要解决同一类中使用的Traits之间的命名冲突,需要使用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


0
投票

我们必须给每个冲突方法赋予名称,我们必须定义如果我们将通过其原始名称调用方法,那么将调用特征的方法。所以这里是完整的解码。

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(); 
© www.soinside.com 2019 - 2024. All rights reserved.