【问题标题】:Call to an overrided trait method调用覆盖特征方法
【发布时间】:2013-06-21 10:19:10
【问题描述】:

我想通过我的 DIC 使用特征来实例化我的对象:

trait TUseContainer {

    protected $c;

    public function __construct(Container $c) {
        $this->c=$c;
    }

}

class MyClass {
    use TUseContainer;

    //Optional
    public function __construct(ClassInheritedFromContainer $c){
        TUseContainer::__construct($c);
        //MyClass __construct stuff
    }

}

所以我的问题是:

  1. TUseContainer::__construct($c);会起作用吗?
  2. 如果没有,是否 parent::__construct($c);会成功吗? (我认为不会)
  3. 是 trait::myOverridedMethod();调用非静态覆盖方法的好方法?
  4. 您认为我应该使用“as”关键字吗? (我认为这是个坏主意)
  5. “TUseContainer”对我打算做的事情来说是个好名字吗?

欢迎大家发表意见,谢谢。

我会做一些测试并发布结果。

【问题讨论】:

  • 我有:致命错误:无法静态调用非静态方法 TUseContainer::__construct(),假设 $this 来自第 12 行 /path/to/MyClass.php 中的不兼容上下文
  • 谢谢罗伯特,但它并不完全相同,因为 __construct 是继承和覆盖的。优先级改变规则。

标签: php traits


【解决方案1】:

我有一些简单的解决方法:

trait TUseContainer {

    protected $c;

    public function __construct(Container $c) {
        $this->setContainer($c);
    }

    protected function setContainer(Container $c){
        $this->c=$c;
    }
}

class MyClass {
    use TUseContainer;

    //Optional
    public function __construct(ClassInheritedFromContainer $c){
        $this->setContainer($c);
        //MyClass __construct stuff
    }

}
  1. 没有
  2. 没有
  3. 没有
  4. 没有
  5. 打开

仍然欢迎所有评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2011-01-03
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多