phpbar.de logo

Mailinglisten-Archive

[php] Zugriff in Methode von Parentklasse auf Property von Childklasse funktioniert nicht

[php] Zugriff in Methode von Parentklasse auf Property von Childklasse funktioniert nicht

Yannik Hampe yannik at cipher-code.de
Sam Dez 13 21:42:42 CET 2008



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