marv: Aufruf einer Methode aus der Elternklasse

Hallo,

ich stehe vor folgendem Problem: Ich habe eine Reihe von Klassen, die alle denselben Konstruktor und dieselbe save-Methode besitzen. Die save-Funktion stellt praktisch eine Weiche dar, die entweder eine insert- oder eine update-Methode aufruft (je nachdem, ob das Objekt für einen schon existierenden DB-Datensatz steht oder nicht).

Der Konstruktor und die save-Methode sind wie gesagt bei allen Klassen gleich, die update- bzw. insert-Methoden unterscheiden sich von Klasse zu Klasse. Deswegen wollte ich den Konstruktor und die save-Methode nun in eine BaseClass auslagern, von der die Klassen erben, um Redundanzen zu vermeiden.

Bei dem Konstruktor hat das auch gut geklappt. Da in den Klassen kein Konstruktor vorhanden ist, wird der Konstruktor der BaseClass geladen. Bei der save-Methode funktioniert das im Prinzip auch, jedoch kann ich von dort aus nicht mehr die update- bzw. insert-Funktion aufrufen, da sie in der Kindklasse als private markiert sind (sie sollen ja nur über save() ausgeführt werden). Ich bekomme da dann folgenden Fehler:

Fatal Error: Call to private method ClassXY::insert() from context 'BaseClass'

Mein Quellcode sieht vereinfacht so aus:

class BaseClass {  
	public function __construct(...) {  
		...  
	}  
  
	public function save() {  
		if(...) {  
			$this->insert();  
		} else {  
			$this->update();  
		}  
	}  
}  
  
class BeispielKlasse extends BaseClass {  
	private function insert() {  
		...  
	}  
  
	private function update() {  
		...  
	}  
}

Kann man dieses Problem irgendwie lösen? insert() und update() auf public setzen, fänd ich eher unschön.

Beste Grüße,
Marvin

  1. Hallo,

    Kann man dieses Problem irgendwie lösen? insert() und update() auf public setzen, fänd ich eher unschön.

    Warum nimmst Du nicht protected statt private? Das ist ja genau dafür gedacht...

    Viele Grüße,
    Christian

    1. Hallo,

      »» Kann man dieses Problem irgendwie lösen? insert() und update() auf public setzen, fänd ich eher unschön.

      Warum nimmst Du nicht protected statt private? Das ist ja genau dafür gedacht...

      Viele Grüße,
      Christian

      Hmpf, danke - war klar, dass es das Offensichtlichste ist, was ich übersehen habe. Ich hatte "protected" als "final" in Erinnerung und war deshalb davon ausgegangen, dass es was anderes darstellt, als ich benötige... :-)

      Danke!