Erbschaftsstreitigkeiten

03/08/2014 - 10:38 von Stefan+Usenet | Report spam
Eine abstrakte Elternklasse "Foo" definiert die Funktion:

abstract class Foo {
public static function getCollectionClassName() {
return get_called_class() . 'Collection';
}
}

Feine Sache, passt in 99% der Faelle und laesst sich im Rest davon
ueberschreiben.

Jetzt komme ich auf die Idee, die abgeleitete Klasse "Foo_Bar"
ebenfalls abstrakt zu deklarieren und davon noch einmal mehrere
Unterklassen abzuleiten, die jedoch die Collection "Foo_BarCollection"
der abstrakten Elternklasse verwenden sollen.

Intuitiv ist es IMHO, in "Foo_Bar" die Methode nicht zu
ueberschreiben, weil der Default "Foo_BarCollection" ja in Ordnung
ist. Also:

abstract class Foo_Bar extends Foo {
// Aufruf von Foo_Bar::getCollectionClassName()
// ergibt "Foo_BarCollection". Passt.
}


Intuitiv ist es IMHO weiters, in "Foo_Bar_Baz" die Methode nicht zu
ueberschreiben, weil ja die Collection-Klasse der Elternklasse
verwendet werden soll, unabhaengig von deren konkreter Bezeichnung.
Also:

class Foo_Bar_Baz extends Foo_Bar {
// Aufruf von Foo_Bar_Baz::getCollectionClassName()
// soll parent::getCollectionClassName() ergeben
//
// Wuerde passen, waere die Methode in Foo_Bar explizit
// deklariert, anstatt ueber Magie. Ist sie jedoch nicht,
// was diese Klasse aber eigentlich nicht "wissen" kann.
}


Das klappt natuerlich nicht: der Aufruf von
Foo_Bar_Baz::getCollectionClassName() faellt bis in die abstrakte
Basisklasse Foo zurueck, get_called_class() liefert "Foo_Bar_Baz",
und die Funktion verweist damit auf eine Klasse, die nicht
existiert.

Momentan ueberschreibe ich Foo_Bar_Baz::getCollectionClassName() mit
dem gewuenschten Klassennamen. Schoen finde ich das allerdings
nicht, weil es Informationen ueber die Elternklasse voraussetzt,
die in einem vollkommen anderen Zustaendigkeitsbereich liegt.

Laesst sich das nicht auch eleganter gestalten, idealerweise direkt
in Foo?

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Die Spannung zu fühlen! Stefan, wenn der Partner laut muffelt!
(Sloganizer)
 

Lesen sie die antworten

#1 Christoph M. Becker
03/08/2014 - 13:13 | Warnen spam
Stefan Froehlich schrieb:

Eine abstrakte Elternklasse "Foo" definiert die Funktion:

abstract class Foo {
public static function getCollectionClassName() {
return get_called_class() . 'Collection';
}
}

Feine Sache, passt in 99% der Faelle und laesst sich im Rest davon
ueberschreiben.

Jetzt komme ich auf die Idee, die abgeleitete Klasse "Foo_Bar"
ebenfalls abstrakt zu deklarieren und davon noch einmal mehrere
Unterklassen abzuleiten, die jedoch die Collection "Foo_BarCollection"
der abstrakten Elternklasse verwenden sollen.

Intuitiv ist es IMHO, in "Foo_Bar" die Methode nicht zu
ueberschreiben, weil der Default "Foo_BarCollection" ja in Ordnung
ist. Also:



IMHO liegt hier der Hund begraben. Bei den meisten oder gar allen
Kindern von Foo_Bar willst Du ja Foo_BarCollection haben. Dann darfst Du
aber nicht den "Late Static Binding" Klassennamen verwenden, sondern den
Namen der Klasse, in der die Methode definiert ist, also:

abstract class Foo_Bar extends Foo {
public static function getCollectionClassName() {
return get_class() . 'Collection';
}

Christoph M. Becker

Ähnliche fragen