クラスで宣言することでtrait
メソッドをオーバーライドできることを知っています。trait
Propertyも同様です。これは安全ですか?それはドキュメンテーションにはないので、私はこれを実装するのをためらっています。
ドキュメントから
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.
特性が使用されているクラスの特性のプロパティをオーバーライドすることはできません。ただし、特性が使用されているクラスを拡張するクラスの特性のプロパティをオーバーライドできます。例えば:
trait ExampleTrait
{
protected $someProperty = 'foo';
}
abstract class ParentClass
{
use ExampleTrait;
}
class ChildClass extends ParentClass
{
protected $someProperty = 'bar';
}
私の解決策はコンストラクタを使用することでした、例:
trait ExampleTrait
{
protected $someProperty = 'foo';
}
class MyClass
{
use ExampleTrait;
public function __construct()
{
$this->someProperty = 'OtherValue';
}
}
この場合、プロパティupdatable
を使用した代替ソリューション。
プロパティがトレイトのメソッド内でのみ必要な場合にこれを使用します...
trait MyTrait
{
public function getUpdatableProperty()
{
return isset($this->my_trait_updatable) ?
$this->my_trait_updatable:
'default';
}
}
...そしてクラスで特性を使用します。
class MyClass
{
use MyTrait;
/**
* If you need to override the default value, define it here...
*/
protected $my_trait_updatable = 'overridden';
}