web-dev-qa-db-fra.com

Annulation des propriétés de trait de doctrine

Je sais que vous pouvez remplacer une trait méthode en la déclarant dans votre classe. J'étais curieux de savoir s'il était possible de contourner une trait Propriété de la même manière. Est-ce sécuritaire de le faire? Ce n'est pas dans la documentation, donc j'hésite à mettre cela en œuvre.

De la documentation

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

14
DanHabib

Vous ne pouvez pas remplacer la propriété d'un trait dans la classe où il est utilisé. Cependant, vous pouvez remplacer la propriété d'un trait dans une classe qui étend la classe où le trait est utilisé. Par exemple:

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

abstract class ParentClass
{
    use ExampleTrait;
}

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

Ma solution a été d'utiliser le constructeur, exemple:

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

class MyClass
{
    use ExampleTrait;

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

Une solution alternative, utilisant dans ce cas la propriété updatable.

J'utilise ceci lorsque la propriété n'est requise que par les méthodes du trait ...

trait MyTrait
{
    public function getUpdatableProperty()
    {
        return isset($this->my_trait_updatable) ?
            $this->my_trait_updatable:
            'default';
    }
}

... et en utilisant le trait dans une classe.

class MyClass
{
    use MyTrait;

    /**
     * If you need to override the default value, define it here...
     */
    protected $my_trait_updatable = 'overridden';
}
1
Steve