MB: In welchem Bereich sind Traits nützlich?

Beitrag lesen

moin,

schön und klar erklärt aber das weis ich. Meine Frage war aber ne andere. Sorry wenn ich nicht besser ausdrücken kann. Ich hoffer ein Beispiel hilft:

class BarObject {
  public $quz;
  public $tok
}

trait BazTrait {

  public function doSomethingWithObject() : void {
    /* any code */;
  }
}

class FooModel {

  use BazTrait;
  
  private $_barObj;
  
  public function __construct( BarObject $bar ) {
    $this->_barObj = $bar;
  }
}

$f = new FooModel( new BarObject );
$f->doAnything( 

BarObject soll irgend n Objekt sein und das Trait BazTrait soll Methoden für Objekte in der Art von BarObject bereit stellen. Die Frage ist nun: kann man getrost andere Instanzen & Klassen die es schon in FooModel gibt, im Trait BazTrait verwenden? Ich mein, dann ist die Gefahr der Kopplung da. Ein weiteres Beispiel an dem Codebeispiel:

trait BazTrait {

  public function doSomethingWithObject() : void {
    $this->_fuzObj /* any code with FuzObject */;
  }
}

class FooModel {

  use BazTrait;
  
  private $_barObj;
  private $_fuzObj;
  
  public function __construct( BarObject $bar, FuzObject $fuz ) {
    $this->_barObj = $bar;
    $this->_fuzObj = $fuz;
  }
}

Beim Trait BazTrait habe ich, in der Methode doAnythingWithObject(), den Code spezifiziert mit $this->_fuzObj. Im ersten Beispiel ist es gleich wer das Trait BazTrait verwendet, da es nicht gekoppelt und spezifisch ist, nur ein Objekt eben das das Trait behandelt. Im Zweiten Beispiel ist das nicht der Fall, da entsteht eine kopplung mit der Klasse FooModel. Und Dahin gehend meine Fragen-Liste in der Eingangsfrage:

  • gibt es Konventionen
  • Muss man Traits von anderen Klassen & Instanzen abschiermen, sodass sie Autonom sind, oder nicht abschiermen
  • wann ist eine Trait Verwendung Sinnvoll

Ich hoffe es ist verständlicher geworden.

lgmb