Einzelnen Beitrag anzeigen
  #7  
Alt 28.09.2007, 03:04:07
Benutzerbild von z0iD
z0iD z0iD ist offline
Junior Member
 
Registriert seit: Mar 2006
Beiträge: 415
z0iD eine Nachricht über ICQ schicken
AW: Klassenmethoden Nachträglich definieren

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.

----------
Bitte vor dem Fragen lesen: Wie man Fragen richtig stellt.
Mit Zitat antworten