SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 27.09.2007, 16:01:38
pmneo pmneo ist offline
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
Mit Zitat antworten
  #2  
Alt 27.09.2007, 17:33:47
feuervogel feuervogel ist offline
SELFPHP Guru
 
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
AW: Klassenmethoden Nachträglich definieren

Zitat:
Zitat von pmneo Beitrag anzeigen
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 17:34:41 Uhr)
Mit Zitat antworten
  #3  
Alt 27.09.2007, 17:45:20
pmneo pmneo ist offline
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ß
Mit Zitat antworten
  #4  
Alt 27.09.2007, 19:36:41
rambi
Guest
 
Beiträge: n/a
AW: Klassenmethoden Nachträglich definieren

Man kann in PHP keine Methoden nachträglich hinzufügen!!!
(zum Glück)
Mit Zitat antworten
  #5  
Alt 27.09.2007, 19:37:56
feuervogel feuervogel ist offline
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.
Mit Zitat antworten
  #6  
Alt 27.09.2007, 23:47:49
pmneo pmneo ist offline
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ß
Mit Zitat antworten
  #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
  #8  
Alt 28.09.2007, 03:20:10
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

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.
Mit Zitat antworten
  #9  
Alt 28.09.2007, 09:09:15
pmneo pmneo ist offline
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); 
Mit Zitat antworten
  #10  
Alt 28.09.2007, 11:23:34
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

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.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zeilenumbruch in einem String definieren!? Dutchi MySQLi/PDO/(MySQL) 0 18.06.2007 16:41:51
bereich zum anklicken definieren Willow HTML, CSS und JavaScript Help! 2 02.04.2006 07:40:43
Abstand zwischen Aufzählungspunkten definieren??? BenjaminG HTML, CSS und JavaScript Help! 5 21.04.2005 18:11:01
fenstergröße definieren DJ-Silver PHP Grundlagen 1 12.03.2004 18:24:28
Variablen definieren! Satherlor PHP Grundlagen 2 06.12.2003 00:37:48


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:52:35 Uhr.


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


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt