假设我们有两个特征(在PHP 7.1中测试):
<?php
trait HelloA
{
private function X()
{
echo "x";
}
}
trait HelloB
{
private function X()
{
echo "y";
}
}
如果我们想要应用任何特征并使方法X公开,我们可以像这样定义类:
class Summary
{
use HelloA {
HelloA::X as public;
}
}
然后我们可以毫无问题地使用
$s = new Summary();
$s->X();
它没有任何问题。
但是如果我们想要使用这两个特征并且像这样定义了Summary类:
class Summary
{
use HelloA, HelloB {
HelloA::X as public;
}
}
我们会收到致命错误:
Trait方法X尚未应用,因为在Summary上存在与其他特征方法的碰撞。
我们可以像这样解决冲突定义类:
class Summary
{
use HelloA, HelloB {
HelloA::X insteadof HelloB;
}
}
但现在无法运行
$s = new Summary();
$s->X();
,因为我们会得到致命错误:
致命错误:未捕获错误:从上下文''
调用私有方法Summary :: X()
问题是 - 在Summary类中是否有任何方法可以解决冲突问题以及更改方法可见性?
目前我认为这是不可能的,例如这样的结构:
use HelloA, HelloB {
HelloA::X insteadof HelloB as public;
}
会导致Parse错误,但也许它应该以其他方式编写以使其工作?
显然,作为解决方法,我们可以使用不同的方法名称在Summary类中创建并在其中运行X
方法,但这不是我要求的:)
答案 0 :(得分:3)
当然,您可以更改方法可见性并进行冲突解决,而不是在同一语句中。
class Summary
{
use HelloA, HelloB {
HelloA::X insteadof HelloB;
HelloA::X as public;
}
}
这应该可以满足您的期望。