web-dev-qa-db-ja.com

オーバーライドDoctrine特性プロパティ

クラスで宣言することでtraitメソッドをオーバーライドできることを知っています。traitPropertyも同様です。これは安全ですか?それはドキュメンテーションにはないので、私はこれを実装するのをためらっています。

ドキュメントから

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.

http://php.net/manual/en/language.oop5.traits.php

22
DanHabib

特性が使用されているクラスの特性のプロパティをオーバーライドすることはできません。ただし、特性が使用されているクラスを拡張するクラスの特性のプロパティをオーバーライドできます。例えば:

trait ExampleTrait
{
    protected $someProperty = 'foo';
}

abstract class ParentClass
{
    use ExampleTrait;
}

class ChildClass extends ParentClass
{
    protected $someProperty = 'bar';
}
40
Mathew Tinsley

私の解決策はコンストラクタを使用することでした、例:

trait ExampleTrait
{
    protected $someProperty = 'foo';
}

class MyClass
{
    use ExampleTrait;

    public function __construct()
    {
         $this->someProperty = 'OtherValue';
    }
}
13

この場合、プロパティ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';
}
2
Steve