Laravel - Fatal error: Trait method subscription has not been applied
Laravel - Fatal error: Trait method subscription has not been applied
这是我面临的一个代码场景,我试图通过为我的 class 特征方法提供一个名称来解决它,但问题仍然存在。我该怎么办?
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 Conflict Resolution:
If two Traits insert a method with the same name, a fatal error is produced, if the conflict is not explicitly resolved.
To resolve naming conflicts between Traits used in the same class, the
insteadof operator needs to be used to choose exactly one of the
conflicting methods.
手册给出了一个使用 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
我们必须为每个冲突方法命名,并且我们必须定义如果我们将通过其原始名称调用方法,那么将调用特征的方法。所以这里是完整的解决代码。
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();
这是我面临的一个代码场景,我试图通过为我的 class 特征方法提供一个名称来解决它,但问题仍然存在。我该怎么办?
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 Conflict Resolution:
If two Traits insert a method with the same name, a fatal error is produced, if the conflict is not explicitly resolved.
To resolve naming conflicts between Traits used in the same class, the insteadof operator needs to be used to choose exactly one of the conflicting methods.
手册给出了一个使用 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
我们必须为每个冲突方法命名,并且我们必须定义如果我们将通过其原始名称调用方法,那么将调用特征的方法。所以这里是完整的解决代码。
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();