![]() 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