追踪冲突解决方案以及可见度的变化

时间:2017-03-18 19:11:24

标签: php traits php-7

假设我们有两个特征(在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方法,但这不是我要求的:)

1 个答案:

答案 0 :(得分:3)

当然,您可以更改方法可见性并进行冲突解决,而不是在同一语句中。

class Summary
{
    use HelloA, HelloB {
        HelloA::X insteadof HelloB;
        HelloA::X as public;
    }
}

这应该可以满足您的期望。