Hi Phil.
Das Ganze gibt eine Aufruffunktion für sowas, wie ein Simpleton-Pattern, wobei es weniger um die einmalige Initialisierung von Klassen geht, als darum, den Zugriff auf Objekte bzw. deren Methoden ganz generell zu steuern.
Es gibt also verschiedene Module in Form von Klassen und nicht jeder Benutzer darf alle Methoden eines Moduls ausführen und manche Module werden als ein anderer Benutzer ausgehführt. Andere Methoden-Aufrufe müssen immer die selbe Instanz einer Klasse 'treffen', also eben die Simpleton-Geschichte.
Diese Funktionalität stellt eine Klasse bereit (ModuleHandler oder so) und jeder Aufruf einer Methode irgendeines Moduls, also auch des 'eigenen' ($this->methode) läuft dann über diese Klasse. Es ist dann aber wiederum umständlich, sich zunächst die Instanz der Klasse in eine Varible zu holen und über die dann die zentrale Methode aufzurufen, die die ganzen Aufrufe managed. Einfacher ist es, den Aufruf über eine Funktion zu steuern, die die Instanz des Modulhandlers als statische Variable immer parat hält.
Beispiel:
class MyModule
{
function do_something ()
{
// hier soll jetzt auf das Session-Modul zugegriffen werden
// sagen wir, um die der Session-Var $foo den Wert 'bar' zu
// uebergeben
// Instanz des Modul-Handlers holen
global $module_handler;
$session_module = &$module_handler->get_module('session');
$session_module->register(array('foo'=>'bar'));
}
}
Das ist ziemlich beschissen, vor allem, wenn du die gleiche Geschichte für jedes $this durchziehen musst.
Mit einer solchen Aufruffunktion sieht es dann z.B. so aus:
class MyModule
{
function do_something ()
{
mod_call('session.register', array('foo'=>'bar'));
}
}
...hinter dem session.register, oder auch session::register (ist in einer PHP-Umgebung wahrscheinlich vertrauter) sollen dann noch parameter übergeben werden können, wie '-x' für exclusiv, wenn keine bestehende Instanz des angesprochenen Moduls verwendet werden soll, sondern eine neue erzwungen wird ... sowas halt.
Hier siehst du schon, dass das dein Array-Vorschlag eine ganz üble Syntax produzieren würde:
mod_call('session.register', array(array('foo'=>'bar')));
...bei diesem einfachen Beispiel, aber das könnte, wie in meinem Eingangsbeispiel dann ja auch so aussehen:
mod_call('session.register', array('test1', array('foo'=>'bar'), 42));
...und das will ich eigentlich nicht. außerdem, und das ist viel wichtiger, kriegst du so ja das Problem mit der Übergabe als Referenzen nicht gelöst. Du kanst letztlich nur alle oder garkeinen als Referenz übergeben oder noch eine weitere Array-Ebene einführen, in der diese Info dann mitgeschickt wird...!
Ich mein, ich hab aber schon die Löung und die ist ganz ähnlich, wie dein Code oben. Irgendwie so:
$args = array('test1', array(1,2,3), 42);
$cmd = 'my_function('
for ($i=0; $i<func_num_args(); $i++) {
$cmd .= '&$args[' . $i . ']';
if (func_num_args() != $i) $cmd .= ', ';
}
$cmd .= ');'
eval ($cmd);
...müsste doch gehen, oder. Gleich mal testen...
Danke.
Basti