CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
27.09.2007, 15:01:38
|
Anfänger
|
|
Registriert seit: Sep 2007
Beiträge: 9
|
|
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
|
27.09.2007, 16:33:47
|
SELFPHP Guru
|
|
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
|
|
AW: Klassenmethoden Nachträglich definieren
Zitat:
Zitat von pmneo
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.
Geändert von feuervogel (27.09.2007 um 16:34:41 Uhr)
|
27.09.2007, 16:45:20
|
Anfänger
|
|
Registriert seit: Sep 2007
Beiträge: 9
|
|
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ß
|
27.09.2007, 18:36:41
|
|
AW: Klassenmethoden Nachträglich definieren
Man kann in PHP keine Methoden nachträglich hinzufügen!!!
(zum Glück)
|
27.09.2007, 18:37:56
|
SELFPHP Guru
|
|
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
|
|
AW: Klassenmethoden Nachträglich definieren
und ein design, welches eine 8000 zeilen lange klasse erfordert sollte man nochmals überdenken...und zwar grundsätzlich.
|
27.09.2007, 22:47:49
|
Anfänger
|
|
Registriert seit: Sep 2007
Beiträge: 9
|
|
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ß
|
28.09.2007, 02:04:07
|
|
Junior Member
|
|
Registriert seit: Mar 2006
Beiträge: 415
|
|
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.
|
28.09.2007, 02:20:10
|
|
Junior Member
|
|
Registriert seit: Mar 2006
Beiträge: 415
|
|
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.
__________________
Bitte sprich entweder deutsch oder englisch mit mir, aber nicht beides gleichzeitig.
----------
Bitte vor dem Fragen lesen: Wie man Fragen richtig stellt.
|
28.09.2007, 08:09:15
|
Anfänger
|
|
Registriert seit: Sep 2007
Beiträge: 9
|
|
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);
|
28.09.2007, 10:23:34
|
|
Junior Member
|
|
Registriert seit: Mar 2006
Beiträge: 415
|
|
AW: Klassenmethoden Nachträglich definieren
Stimmt, selbstverständlich muss die aufzurufende Funktion das $this auch erwarten. Kleiner Flüchtigkeitsfehler.
__________________
Bitte sprich entweder deutsch oder englisch mit mir, aber nicht beides gleichzeitig.
----------
Bitte vor dem Fragen lesen: Wie man Fragen richtig stellt.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:27:55 Uhr.
|