Instanz einer Klasse mit dynamischen Namen und Singleton-Pattern

daddz

Mitglied
Hallo!

Puh, der Titel klingt vielleicht etwas verwirrend deshalb erläutere ich mein Problem mal genauer.

Ich habe eine Klasse, nennen wir sie ModuleLoader.

Diese Klasse besitzt eine Methode namens _load(), der man als Parameter den Namen eines Moduls übergibt.

Als Beispielmodul nehmen wir nun mal die Klasse FooBar, die nach dem Singleton-Pattern aufgebaut ist und eine Funktion namens getInstance() um eine Instanz zu bekommen besitzt.

Der Funktionsaufruf lautet folgedessen _load('FooBar').
Diese Funktion sucht dann nach der Datei und bindet diese ein und versucht anschließend eine Instanz zu bekommen.

Der Aufruf sieht dann so aus:
PHP:
public function _load($moduleName) {
    // ... require_once() etc...
    return $moduleName::getInstance(); // Hier scheitert das ganze!
}
Ich weiß nicht wie ich die Funktion der Klasse aufrufen soll, denn so wie ich es probiert habe, lieferte mir PHP immer folgenden Fehler:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM ....

Was soll ich tun? Wie soll ich die Methode sonst aufrufen?

Ich hoffe ihr versteht mein Anliegen und könnt mir unter die Arme greifen.

greetz
daddz
 
Da ich demnächst selber vor dem Problem stehe, habe ich gleich mal einen Testfall gebaut:
PHP:
<?php
class TestSingleton {
    private static $instance = null;

    private $createTime = null;

    private function __construct() {
        $this->createTime = time();
    }

    public static function getInstance() {
        if (self :: $instance == null) {
            self :: $instance = new TestSingleton();
        }
        return self :: $instance;
    }

    public function echoCreationTime() {
        echo date('Y-m-d H:i:s');
    }

}

$className = 'TestSingleton';

call_user_func(array ($className, 'getInstance'))->echoCreationTime();

?>
Mit [phpf]call_user_func[/phpf] funktioniert es, aber einfachere Schreibweisen sind willkommen.

Gruß hpvw
 
Oh, danke. :-(

Zumindest kann ich mit diesem call_user_func-"work-around" vorankommen.

Falls jemand eine andere bzw. elegantere Lösung weiß, her damit.
Schließlich gibt es nun schon 2 Interessenten! ;)

greetz
daddz
 

Neue Beiträge

Zurück