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