Vererbung und Konstruktoren

ThiKool

Erfahrenes Mitglied
Hallo zusammen,

ich arbeite mich gerade in die OOP ein.

Ich habe folgendes Beispiel:

Oberklasse = Item
Benötigte Attribute sind: id, name

Davon abgeleitet sind die Klasse Klamotten und Waffen
Klamotte hat als Attribut farbe

Waffe hat als Attribut magazingröße


Alle Attribute werden zwingend zum erstellen eines Objekts benötigt. Also habe ich in der Item Klasse den Konstruktor für id und name und in den abgeleiteten Klassen je auch einen Konstruktor für id, name, farbe, der dann die benötigten Werte an den Eltern Konstruktor weitergibt:

parent::__construct($id, $name);

Funktioniert alles ganz ordentlich, allerdings möchte ich ja eben nicht alle Attribute in die Klammern packen müssen, wenn ich das Objekt erstelle:

new Clothing($id, $name, $farbe);

sondern dies lieber schön über setter machen.

$shoe
->setId($id)
->setName($id)
->setFarbe($id);

Auch kein Problem.

Wie stelle ich aber bei dieser Variante sicher, dass auch wirklich alles gesetzt wird, wenn ich auf Konstruktoren verzichte?

Gibt es eine Möglichkeit eine Methode zu implementieren die VOR dem jeweiligen Getter aufgerufen wird und mir dann zb sagt: Attribut XY ist nicht gesetzt?

Oder gibt es eine andere Möglichkeit um zu prüfen bzw. festzulegen, welche Attribute gesetzt werden müssen?

Oder lässt man diese Überprüfung ganz weg? Man merkt ja, wenn nichts zurück kommt?

Was ist dabei best Practice?

Danke euch!
 
Hi

prinzipiell spricht nichts dagegen, (auch) alles im Konstruktur zu übergeben (auch = die Setter für später deswegen nicht weglassen).

Wenn es unbedingt ohne sein soll:
Falls es bestimmte Werte gibt, die eine Variable nicht haben darf (zB. null): Am Anfang aller Methoden, die mit den gesetzten Werten wirklich was machen, prüfen, ob der Wert wohl nicht null ist. Sonst Exception, Fehler-Returnwert oder sonstwas. (Bzw. kann man eine Prüfmethode machen und die überall aufrufen).

Falls null usw. auch gültige Werte sind, entweder das als Defaultwert gelten lassen, oder pro wichtiger Variable eine weitere Variable mit true/false ob schon ein Wert gesetzt wurde (nicht wirklich toll...).
 
Zuletzt bearbeitet:
Ok vielen Dank für deine Denkanstöße.
Und es gibt auch keine schönere Schreibweise dem konstruktor die Werte zu übergeben?

Bei >10 werten ist das halt immer so ne Sache mit der Reihenfolge.
 
Eine Variante wäre die Werte mittels eines Arrays dem Konstruktor zu übergeben.

z.B. so:
PHP:
class TestClass {
   private $wert1 = NULL;
   private $wert2 = NULL;
   private $wert3 = NULL;
   private $wert4 = NULL;

   public function __construct( array $INPUT_ARRAY ) {
      foreach( $INPUT_ARRAY as $key => $value ) {
         if( property_exists('TestClass', $key) )
            $this ->$key = $value;
      }
   }

   public function getWert1( ) {
      return $this ->wert1;
   }

   public function setWert1( $value ) {
      $this ->wert1 = $value;
      return $this;
   }

   public function getWert2( ) {
      return $this ->wert2;
   }

   public function setWert2( $value ) {
      $this ->wert2 = $value;
      return $this;
   }
.....
}

$INSTANZ = new TestClass( array('wert1' => 'meine erster Wert',
                                'wert2' => 'mein 2. Wert'
                                'wert4' => 'noch ein Wert' ) );
 
Zurück