Rolf B: Wiederholung der Arguments von PHP-Methods bei Beerbung abstrakter Klassen vermeiden

Beitrag lesen

Hallo borisbaer,

...weil ich noch ein optionales LIMIT einbauen wollte,
Dann musste ich bei allen Erben das zusätzliche Argument einfügen.

Aber eben nur dann, wenn die Erben read() überschreiben.

In deinem Beispiel überschreibst Du read, um den Mode vorzugeben.

Wie wär's hiermit (ich schreibe "...", wenn ich nicht all deinen Code abschreiben will):

abstract class Model {
   public static function read(..., $mode=null, ...) {
      if ($mode === null) {
         $mode = static::get_mode();
      }
   }
   protected static function get_mode() { return PDO::FETCH_DEFAULT; }
}

class XyzModel extends Model {
   protected static function get_mode() { return PDO::FETCH_BOUND; }
}

Jetzt musst Du read gar nicht überschreiben, kannst aber trotzdem den Mode verändern.

Eine andere Alternative wäre eine alternative Parameterübergaben. Die hast Du Dir allerdings schon erschwert, weil Du für die Conditions ein Array akzeptierst. Aber ich denke, Conditions hast Du eigentlich immer.

Du könntest für Parameter 2 den Typ als array|int festlegen. Bekommst Du ein Array, ist das ein Array mit möglichen Parametern. Das ist dann natürlich nicht typsicher, insofern also ein Rückschritt. Aber man könnte dann so aufrufen:

XyzModel::read("Hugo=3", [ "mode" => PDO::FETCH_BOUND, "limit" => 5 ]);

Oder wie auch immer Du Deine Conditions aufschreibst. Wenn Du im $mode Parameter ein Array findest, dann guckst Du, ob es Keys für deine Parameter enthält, und es hindert Dich niemand, da jederzeit einen Key hinzuzufügen.

So richtig schwierig ist das eigentlich nur, weil Du alles statisch machst. Wären das Instanzmethoden und würdest Du für die Aufrufe ein Model-Objekt mit new erzeugen, dann könntest Du Dinge wie fetch-mode oder limit als Properties anbieten, nach dem new Aufruf setzen und dann read nur mit den Conditions aufrufen.

Rolf

--
sumpsi - posui - obstruxi