PHP Trait碰撞构造函数

时间:2015-11-09 14:30:19

标签: php traits

如果这是重复的道歉,我之前确实在搜索答案。

我正在努力重载特征中定义的方法。它抛出致命的错误:

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)
    {
        // ...
    }
}

2 个答案:

答案 0 :(得分:7)

你可以像这样解决构造函数碰撞。

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没有构造函数...

答案 1 :(得分:0)

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

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