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

Beitrag lesen

Hallo Rolf,

Andererseits ist es nicht gut, eine Basisklasse ständig zu ändern. Eigentlich sollte man sich einmal Gedanken gemacht haben, und dann das Framework stabil halten. Damit man eben nicht ständig ändern muss.

Ich verstehe. Dann gibt es da kein Workaround, sondern man muss eben gut im Voraus planen.

Die Frage ist auch, ob es wirklich nötig ist, read() zu überschreiben. Diese Methode sieht sehr generisch aus, und die für's konkrete Model relevanten Dinge hast Du doch in abstrakten Methoden untergebracht, die zu überschreiben sind. Wenn Du der read-Methode keine Funktionalität hinzufügen musst, kannst Du sie ggf. doch auch unverändert erben.

Könntest du erläutern, an welcher Stelle read() überschrieben wird? Ich habe sie z.B. anpassen müssen, weil ich noch ein optionales LIMIT einbauen wollte, das als Parameter übergeben werden kann. Dann musste ich bei allen Erben das zusätzliche Argument einfügen. So kam mir die Frage, ob ich das nicht irgendwie umgehen kann, falls ich bei read() mal ein Argument ergänzen will.

Und wenn es bei einigen Models darum geht, die Condition oder die Sortierung oder den PDO Mode vorzudefinieren, dann könnte man auch Methoden wie "getDefaultCondition" oder "getPDOMode" schreiben, die eine Modelklasse überschreiben kann, aber nicht muss.

Wie genau würde das denn funktionieren? Wenn ich eine abstrakte Methode in der Eltern-Klasse definiere, dann muss ich diese doch beim Erben ebenfalls zwangsweise definieren. Kann man da Optionalität einstellen?

Falls Du read so aufrufen willst, dass nur der erste und dritte Parameter übergeben werden und der zweite und vierte Parameter ihren Defaultwert behalten, kannst Du das so tun:

$model->read(
   condition: [ "foo" => "bar", "hui" => 17 ],
   sort:      "descending"
);

Oder wie auch immer deine Bedingungen aussehen. Der Trick ist jedenfalls, den Parameternamen mit einem Doppelpunkt vor den Wert zu schreiben. Natürlich musst Du das nicht auf 4 Zeilen verteilen. Das habe ich wegen der Lesbarkeit im Forum gemacht.

Named Arguments helfen mir hier leider nicht, denn bei folgendem Code

public static function read(

	array|string $condition = [],
	int $mode = 0,
	string $sort = '',
	int|string $limit = null,

): bool
{
return parent::read( $condition, PDO::FETCH_BOUND );
}

kann ich zwar

parent::read( condition: $condition, mode: PDO::FETCH_BOUND )

schreiben, aber die Arguments bei public static function read( … muss ich ja trotzdem alle hinschreiben. Um die geht es mir ja letztlich.

Danke für den Input!

Grüße
Boris