Ich hab ein problem, und zwar würde ich gern Methoden einer Klasse dynamisch hinzufügen.
Vorgestellt hatte ich mir das so in der form:
Code:
class Foo
{
var $VAR1 = 'test';
function FesteFunktion()
{
// Tut etwas
}
}
//Methode hinzufügen
function Foo::DynamischeFunktion()
{
// Tut irgendwas
}
Ich hab ein problem, und zwar würde ich gern Methoden einer Klasse dynamisch hinzufügen.
Vorgestellt hatte ich mir das so in der form:
Code:
class Foo
{
var $VAR1 = 'test';
function FesteFunktion()
{
// Tut etwas
}
}
//Methode hinzufügen
function Foo::DynamischeFunktion()
{
// Tut irgendwas
}
Klappt leider nicht ;)
Weiß jemand ob das irgendwie möglich ist !??
Gruß pmneo
du kannst dir u.u. vererbung zu nutze machen, siehe hier:
PHP-Code:
class Foo { var $VAR1 = 'test'; function FesteFunktion() { // Tut etwas }
}
class Bar extends Foo {
function DynamischeFunktion() { // Tut irgendwas
} }
allerdings lässt sich dein eigentliches problem sehr wahrscheinlich auch anders lösen.
Erstmal danke für deine Antwort, vererbungen sind mir bekannt, macht aber leider in meinem fall so keinen Sinn, da ich ja am ende über meine Orginalklasse zugreifen möchte.
Das Problem ist in etwa so:
Ich habe eine Klasse EditForm, welche eingabe Masken generiert.
Ich habe verschiedene Module, die variert werden können sollen.
Momentan sind alle möglichen Felder in der EditForm definiert.
Ich würde aber gerne nur die Grund Felder definieren, und die Speziellen felder, die sich auf andere Module beziehen eben in der entsprechenden modul-php datei.
Das Problem ist eben, das die EditForm Klasse bereits über 8T Zeilen hat, und so könnte ich das etwas aufteilen.
Es geht zwar nicht direkt, aber man kann durchaus soetwas in der Art nachbasteln (auch wenn ich es ebenfalls für einen Entwurfsfehler halte, aber möglicherweise kann es doch in gewissen Sitationen hilfreich sein).
Entweder man hängt sie ein, oder macht es absolut dynamisch und spontan
PHP-Code:
class DynKlasse {
... //andere Funktionen
function exec($fn) {
$params = func_get_args(); //Parameterliste auslesen
array_shift($params); //den Funktionsnamen aus der Parameterliste streichen
$paramlist = '$this'; //die Selbstreferenz zur Parameterliste hinzufügen
foreach ($params as $index => $param) {
$paramlist .= ', $params['.$index.']'; // alle übrigen Parameter hinzufügen
}
return eval('return '.$fn.'('.$paramlist.');'); //eigentliche Funktion ausführen und Ergebnis zurückgeben
}
}
Wie man sieht, muss man einfach nur die Methode DynKlasse::exec() aufrufen. Die Parameter für die einzuhängende Funktion kann man einfach hinter den Funktionsnamen schreiben. Beispiel: Man möchte eine Funktion einbinden, welche die gesamte Klasse ausgibt, wenn der übergebene Parameter 1 ist (ein sinnloseres Beispiel fiel mir grad nicht ein);
PHP-Code:
function SinnloseFunktion ($debug) {
if ($debug === 1) {
var_dump($this);
return true;
}
return false;
}
Dann muss man diese nur mit einer Instanz von DynKlasse ausführen. Etwa:
PHP-Code:
$dk = new DynKlasse();
$dk->exec('SinnloseFunktion',1);
Und schwupps ist die Sache geritzt. Die einzufügende Funktion muss nur eben immer als ersten Parameter die Referenz zur Instanz der verwendeten Klasse erwarten (falls gar kein Parameter gebraucht wird, kann das sogar weggelassen werden).
__________________
Bitte sprich entweder deutsch oder englisch mit mir, aber nicht beides gleichzeitig.
Mir fällt grade noch was ein. Wenn Du unbedingt die Methoden im herkömmlichen Stil aufrufen möchtest (also $instanz->methode($parameter);), dann solltest Du eventuell die gesammte Klasse durch ein eval jagen. Also, anstatt dass Du die Datei mit der eigentlichen Klasse mit include oder require einbindest, lädst Du einfach den gesamten Klassenquelltext in eine Variable (etwa mit file_get_contents()) und führst diese mit eval aus. Die Klasse ist dann genauso definiert, als hättest Du sie mit include oder require eingebunden.
Vorteil ist aber, dass Du die Zeichenkette erweitern kannst. Du könntest etwa an eine bestimmte Stelle eine Markierung in die Klasse setzen und diese dann zur Laufzeit mit weiteren Methodendeklarationen ersetzen. Dann hast Du wirklich eine dynamische Klasse gebaut.
ABER: Das Ganze dürfte wohl aufwendiger/teurer sein, als die Klasse statisch einzubinden, also überlegs Dir gut ob das wirklich sein muss, oder ob Du vielleicht zu viel Funktionalitäten in eine Klasse stopfst die Du besser auf mehrere Klassen umlegen solltest.
__________________
Bitte sprich entweder deutsch oder englisch mit mir, aber nicht beides gleichzeitig.
Dein Beispiel hat nur einen kleinen Fehler ;) und zwar hast du in der function das $this vergessen!
Das werde ich mir auf jedenfall im hinterkopf behalten, aber ich denke ich werde die Klasse doch umdesignen und aufteilen, hat ja letztendlich wenig sinn so ;)
Trotzdem VIELEN Dank!
p.s. das mit eval ist auch keine schlechte idee, allerdings ist das wirklich zu aufwendig!
Gruß
PHP-Code:
class DynKlasse {
var $TMP = "test";
//... //andere Funktionen
function exec($fn) {
$params = func_get_args(); //Parameterliste auslesen
array_shift($params); //den Funktionsnamen aus der Parameterliste streichen
$paramlist = '$this'; //die Selbstreferenz zur Parameterliste hinzufügen
foreach ($params as $index => $param) {
$paramlist .= ', $params['.$index.']'; // alle übrigen Parameter hinzufügen
}
return eval('return '.$fn.'('.$paramlist.');'); //eigentliche Funktion ausführen und Ergebnis zurückgeben
}
}
function SinnloseFunktion ($this,$debug) {
if ($debug === 1) {
echo "<pre>";var_dump($this);echo "</pre>";
return true;
}
return false;
}
$dk = new DynKlasse();
$dk->exec('SinnloseFunktion',1);