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).