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.
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';
}
Ma solution a été d'utiliser le constructeur, exemple:
trait ExampleTrait
{
protected $someProperty = 'foo';
}
class MyClass
{
use ExampleTrait;
public function __construct()
{
$this->someProperty = 'OtherValue';
}
}
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';
}