Hi dedlfix,
Im Allgemeinen verhindert man den Aufruf von Methoden, indem man sie als nicht öffentlich kennzeichnet. Mit so einer Kennzeichnung kümmmert sich PHP darum. Ohne eine solche bleibt dir nur der schon erwähnte Weg durch den Aufrufpfad.
Wie wäre es mit hiermit?
// Unsere Fabrik-Klasse
class Fabrik {
// Von der Fabrik-Klasse darf keine Instanz erzeugt werden!
private function __construct() {}
// in $objekt sollte ein gültiger Klassenname übergeben werde
static public function Erstelle($objekt) {
// Erstelle neue Instanz von sich selber
$fabrik = new self();
// hier wird die gewünschte Klasse erstellt und ihr die
// Fabrik übergeben
return new $objekt($fabrik);
}
}
// Beispiel-Klasse, welche von der Fabrik erstellt
// werden können soll
class FabriziertesObjekt {
// als erster Parameter muss ein Objekt der Fabrik-Klasse übergeben
public function __construct(Fabrik $fabrik) {
// hier folgt weiterer Code
}
}
// funktioniert
$obj = Fabrik::Erstelle('FabriziertesObjekt');
// funktioniert nicht, weil Fabrik nicht erstellt werden darf:
$fab = new Fabrik();
// Fatal error: Call to private Fabrik::__construct()
// from invalid context in [...]
// funktioniert nicht, weil Typ Fabrik erzwungen wird
$fab = new stdClass();
$obj = new FabriziertesObjekt($fab);
// Catchable fatal error: Argument 1 passed to FabriziertesObjekt::__construct()
// must be an instance of Fabrik, instance of stdClass given, called in
// [...] and defined in [...]
Auf dieser Basis müsste man eigentlich arbeiten können...
Viele Grüße,
~ Dennis.