这是我面临的代码方案,我试图通过为我的类提供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();
我希望用户使用的两种方法的名称相同,但功能不同。有什么办法吗?
答案 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();