php - 我可以在特征中使用父类的属性吗?

标签 php traits

可以在特征方法中使用父类的属性/方法吗?

此代码有效,但它是好的做法吗?

class Child extends Base{

  use ExampleTrait;

  public function __construct(){
     parent::__construct();
  }

  public function someMethod(){
    traitMethod();
  }

}

trait ExampleTrait{
  protected function traitMethod(){
    // Uses  $this->model from Base class
    $this->model->doSomething();
  }
}

最佳答案

我不认为这是好的做法。

相反,你可以有一个方法来获取你的模型对象,并将该方法作为你特征中的抽象签名:

trait ExampleTrait {
    abstract protected function _getModel();

    protected function traitMethod() {
        $this->_getModel()->doSomething();
    }
}

class Base {
    protected $_model;

    protected function _getModel() {
        return $this->_model;
    }
}

class Child extends Base {
    use ExampleTrait;

    public function someMethod() {
        $this->traitMethod();
    }
}

或者将您的模型作为参数传递给您的特征方法:

trait ExampleTrait {
    protected function traitMethod($model) {
        $model->doSomething();
    }
}

class Base {
    protected $_model;
}

class Child extends Base {
    use ExampleTrait;

    public function someMethod() {
        $this->traitMethod($this->_model);
    }
}

这两种方法都可以让您利用 IDE 的类型提示。

关于php - 我可以在特征中使用父类的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41712413/

相关文章:

javascript - AJAX/PHP - 以纯 javascript 分段上传大文件

php - SQLSTATE[21000] : Cardinality violation: 1241 Operand should contain 1 column(s). sql查询

php - Symfony2 Timestable 特征 : "Column ' createdAt' cannot be null"

php - 可以在 5.4.x 中禁用 PHP Traits 吗?

pointers - 我可以返回一个结构,该结构使用特征实现中的 PhantomData 来为原始指针添加生命周期而不污染接口(interface)吗?

scala - 实现支持方法链的Scala特性的最佳实践

php - MYSQL更新多表报错

javascript - Bootstrap 模式弹出窗口显示状态 -3 错误

reference - 如何从 &Vec<T> 或 Vec<&T> 创建 &T 的迭代器?

javascript - 如何在 Zend Framework 2 中通过 AJAX 表单上传文件?