PHP Trait冲突构造函数


PHP Trait colliding constructor

很抱歉,如果这是重复的,我之前确实搜索过答案。

我正在努力使一个特性中定义的方法过载。它抛出了一个致命错误:

Fatal error: Configuration has colliding constructor definitions coming from traits in Configuration.php on line 18

他们的类别

<?php
namespace Theirs'Package;
use Theirs'TheirTrait;
class Configration
{
    use TheirTrait;
}

我的班级

<?php
namespace My'Package;
use Theirs'Package'Configuration as BaseConfiguration;
use My'Trait'MyTrait;
class Configuration extends BaseConfiguration
{
    use MyTrait;
}

我的特点

use Theirs'TheirTrait as BaseSomeTrait;
trait MyTrait
{
    use BaseSomeTrait;
    protected function someMethod($something)
    {
        // ...
    }
}

您可以像这样解决构造函数冲突。

trait MyTrait {
    use BaseSomeTrait{
        BaseSomeTrait::__construct as private __otherConstruct;
    }
    public function __construct(/* maybe params here*/)
    {
        // maybe other code
        $this->__otherConstruct(/* maybe params here*/);
        // maybe other code
    }
}

如果MyClass也有构造函数,你需要在那里额外做,或者可能只有在MyTrait没有构造函数的情况下才做。。。

看起来Theirs'TheirTrait'ConfigrationTheirs'Package'Configuration都有构造函数,并且构造函数签名不兼容。(但如果没有两者的代码,就很难说了。)

如果Theirs'Package'Configuration真的打算与Theirs'TheirTrait'Configration一起使用,那么应该为它们编写一份错误报告。否则,我想应该有一些关于如何在代码中使用类和特性的文档,这样它们就不会产生错误。