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

时间:2019-03-16 01:17:30

标签: php laravel traits

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

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

我希望用户使用的两种方法的名称相同,但功能不同。有什么办法吗?

2 个答案:

答案 0 :(得分:1)

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

  

如果两个特性插入一个具有相同名称的方法,并且冲突没有得到明确解决,则会产生致命错误。

     

要解决同一课程中使用的特征之间的命名冲突,   而不是需要使用运算符来选择其中一个   冲突的方法。

该手册使用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

答案 1 :(得分: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();