Mailinglisten-Archive |
Jan Piotrowski wrote: > Hallo Liste, > > ich spiele gerade ein wenig mit PHP5 herum und habe offensichtlich einen > fürchterlichen Knoten im Hirn: > > Fatal error: Cannot access private property > Tiefkuehlkorb::$tiefkueühlItems in X:\...\Warenkorb.class.php on line 47 tiefkUEÜlitems?? Copy&Paste-Fehler? *gg*. Oder selbstgetippte Beispielfehlermeldung mit Tippfehler? > > Kurze Erläuterung: > > - Abstrakte Klasse Warenkorb. > - Tiefkühlkorb implementiert/erweitert Warenkorb um Property. > - Wie kann von Warenkorb geerbte Methode in Tiefkühlkorb auf diese > Property zugreifen? > > Ausführliche Version: > > Ich habe einen (abstrakten) "Warenkorb". Ein Warenkorb hat 2 'Räume' > (Arrays), in die die ausgewählten Artikel reinkommen: einen Raum für > Getränke, einen für Essen. Es gibt eine Methode addItem() die ein "Item" > im passenden Raum ablegt. > > Von diesem seltsamen Warenkorb gibt es nun 2 Implementierungen: Einen > "Egokorb", auf den man groß seinen Namen schreiben kann, und einen > "Tiefkühlkorb", in dem es einen zusätzlichen Raum für Items vom Typ > Tiefkühlware gibt. > > Der Egokorb ist kein Problem, der erweitert einfach alles vom Warenkorb > und kriegt zusätzlich eine neue Property in der man den Namen speichern > kann. > > Der Tiefkühlkorb allerdings fügt einen dritten Raum als Property hinzu. > addItem() ist vom Warenkorb vererbt und nutzt somit (vereinfacht) > $this->$raum[] = $item; um die Sachen hinein zu legen. Da der > Tiefkühlraum allerdings erst im Tiefkühlkorb dazu kommt hat diese > Methode keinen Zugriff auf dieses Property und ich kriege obige > Fehlermeldung. > > Wie kann die ererbte Methode von Warenkorb Zugriff auf den zusätzlichen > Raum im Tiefkühlkorb bekommen? > Oder gehe ich da grundsätzlich was falsch an? > Ich könnte addItem() (und alle davon genutzten Funktionen, die Zugriff > auf die $tiefkuelItems brauchen) in Tiefkuehlkorb einfach reinkopieren - > aber das kann doch nicht die Lösung sein, oder? Ich glaube es wäre einfacher, du würdest wirklich php-Code posten an dem man arbeiten kann... Ich baue mal, so, wie ich das verstanden habe, dass du die Klassen konstruiert hast: abstract class Ware {...} class Essen extends Ware {...} class Getraenk extends Ware {...} class Tiefkuehlware extends Ware {...} abstract class Warenkorb { ... private $raeume =array('essen' => array(), 'getraenke' => array()); public function addItem(Ware $item) { if ($item instanceof Essen) $raeume['essen'][] =$item; elseif ($item instanceof Getraenk) $raeume['getraenke'][] =$item; else throw new Exception('Unbekannter Warentyp'); } ... } class Tiefkuehlkorb extends Warenkorb { public function addItem(Ware $item) { if ($item instanceof Tiefkuehlware) $this->raeume['tiefgekuehltes'][] =$item; // FEHLER! else parent::addItem($item); } } Eine mögliche Lösung wäre es die Klasse Tiefkuehlkorb so abzuändern: class Tiefkuehlkorb extends Warenkorb { private $tiefkuehlraum; public function addItem(Ware $item) { if ($item instanceof Tiefkuehlware) $this->tiefkuehlraum][] =$item; else parent::addItem($item); } } Ob das in deinem Fall eine sinnvolle Lösung ist, ist allerdings ohne weiteres schwer zu sagen. Eine andere Lösung wäre es bereits in der Klasse Warenkorb mehrere Räume zu unterstützen oder die Klasse Warenkorb auf ein Interface zu reduzieren und die entsprechenden implementationen in die implementierenden Klassen zu verschieben... > > Grüße, > Jan Yannik > > PS: Ja, Ego- und Tiefkühlkorb ist natürlich ein dummes vereinfachtes > Beispiel, aber die effektive Aufgabe ist ohne Kontext noch schwerer zu > verstehen. Das Beispiel klingt garnicht so dumm *gg*. Aber ob es vielleicht doch dumm ist, hängt damit zusammen, wie nah es an deinem wirklichen Problem hängt...
php::bar PHP Wiki - Listenarchive