PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Klassenmethoden Nachträglich definieren (http://www.selfphp.de/forum/showthread.php?t=17739)

pmneo 27.09.2007 16:01:38

Klassenmethoden Nachträglich definieren
 
Hallo!!

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

feuervogel 27.09.2007 17:33:47

AW: Klassenmethoden Nachträglich definieren
 
Zitat:

Zitat von pmneo (Beitrag 107136)
Hallo!!

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.

pmneo 27.09.2007 17:45:20

AW: Klassenmethoden Nachträglich definieren
 
Hallo Feuervogel!

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.

Gruß

rambi 27.09.2007 19:36:41

AW: Klassenmethoden Nachträglich definieren
 
Man kann in PHP keine Methoden nachträglich hinzufügen!!!
(zum Glück)

feuervogel 27.09.2007 19:37:56

AW: Klassenmethoden Nachträglich definieren
 
und ein design, welches eine 8000 zeilen lange klasse erfordert sollte man nochmals überdenken...und zwar grundsätzlich.

pmneo 27.09.2007 23:47:49

AW: Klassenmethoden Nachträglich definieren
 
Überdenken is leicht gesagt, die Klasse wurde Komplexer als zuerst erwartet.

Daher suche ich eben einen weg dies einfach aufzuteilen.

Danke schon mal & Gruß

z0iD 28.09.2007 03:04:07

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

z0iD 28.09.2007 03:20:10

AW: Klassenmethoden Nachträglich definieren
 
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.

pmneo 28.09.2007 09:09:15

AW: Klassenmethoden Nachträglich definieren
 
Danke für deine Hilfe!

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


z0iD 28.09.2007 11:23:34

AW: Klassenmethoden Nachträglich definieren
 
Stimmt, selbstverständlich muss die aufzurufende Funktion das $this auch erwarten. Kleiner Flüchtigkeitsfehler.


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:31:46 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.