我知道你可以通过在你的课堂上声明它来覆盖一个trait
方法,我很好奇是否有可能以同样的方式过度使用一个trait
属性.这样做安全吗?它不在文档中,所以我对实现这一点犹豫不决.
来自文档
An inherited member from a base class is overridden by a member inserted by a Trait. The precedence order is that members from the current class override Trait methods, which in turn override inherited methods.
Mat*_*ley 38
您不能在使用特征的类中覆盖特征的属性.但是,您可以在扩展使用特征的类的类中覆盖特征的属性.例如:
trait ExampleTrait
{
protected $someProperty = 'foo';
}
abstract class ParentClass
{
use ExampleTrait;
}
class ChildClass extends ParentClass
{
protected $someProperty = 'bar';
}
Run Code Online (Sandbox Code Playgroud)
ped*_*dev 12
我的解决方案是使用构造函数,例如:
trait ExampleTrait
{
protected $someProperty = 'foo';
}
class MyClass
{
use ExampleTrait;
public function __construct()
{
$this->someProperty = 'OtherValue';
}
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案,在本例中使用属性updatable
.
当仅在特征的方法中需要该属性时,我使用它......
trait MyTrait
{
public function getUpdatableProperty()
{
return isset($this->my_trait_updatable) ?
$this->my_trait_updatable:
'default';
}
}
Run Code Online (Sandbox Code Playgroud)
...并在课堂上使用该特征。
class MyClass
{
use MyTrait;
/**
* If you need to override the default value, define it here...
*/
protected $my_trait_updatable = 'overridden';
}
Run Code Online (Sandbox Code Playgroud)