+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 20 von 24

Klassen in Klassen aufrufen

Eine Diskussion über Klassen in Klassen aufrufen im Forum Technik Ecke. Teil des Off Topic-Bereichs; Achtung, dies ist speziell an Coder gerichtet, also wer da keine Ahnung hat kann sich auch die Mühe sparen weiterzulesen ...

  1. #1
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312

    Klassen in Klassen aufrufen

    Achtung, dies ist speziell an Coder gerichtet, also wer da keine Ahnung hat kann sich auch die Mühe sparen weiterzulesen
    Danke.


    An sich ist dies mit extends schnell gemacht, jedoch bezieht es sich diesmal nicht nur auf eine Klasse, sondern auf ein ganzes System von Klassen, was dazu führen kann, das eine Klasse mit bis zu 3 weiteren agieren muss.

    Daher dachte ich mir, das "class nesting" eine ganz guter Gedanke ist, jedoch nicht in der klassischen Form.

    Ich finde es müsste eine Masterklasse geben, durch welche man Zugriff auf alle Klassen zu jedem Zeitpunkt hat ohne nochmals eine Beziehung zu einer Klasse herzustellen ( ohne extends ).


    hier mein bsp.:

    foo.php:

    1. <?php
    2.  
    3. class foo {
    4.  
    5. function input() {
    6.  
    7. echo bar::output("BARFOO");
    8.  
    9. }
    10. }
    11.  
    12. ?>

    bar.php

    1. <?php
    2. class bar {
    3.  
    4. function output($a) {
    5.  
    6. echo $a;
    7. }
    8.  
    9. }
    10. ?>

    _.php

    1. <?php
    2. class _ {
    3.  
    4. function _() {
    5.  
    6. require("bar.php");
    7. $this->bar = new bar();
    8.  
    9. require("foo.php");
    10. $this->foo = new foo();
    11. }
    12.  
    13. }
    14.  
    15. $_ = new _();
    16. $_->foo->input();
    17. $_->bar->output("FOOBAR");
    18.  
    19. ?>

    ausgabe:

    Code:
    BARFOOFOOBAR
    Was haltet ihr von dieser Lösung ?? ggf. Gegenvorschläge vorhanden ??

    PS: Ich beziehe mich auf PHP4 mit PHP5 geht es natürlich anders noch besser


    ##EDIT
    hm, leider bleibt immernoch das problem, das er es nicht schafft von foo auf bar zuzugreifen, wenn bar selbst noch einen weiteren ablauf startet schade
    Geändert von Osbes (30.07.2006 um 17:49 Uhr)

  2. #2
    Oberfeldwebel
    Avatar von onair
    Registriert seit
    13.10.2003
    Ort
    Bayern
    Alter
    26
    Beiträge
    2.427
    Zitat Zitat von Osbes
    Achtung, dies ist speziell an Coder gerichtet, also wer da keine Ahnung hat kann sich auch die Mühe sparen weiterzuleben
    Danke.

    muss ich mich jetzt umbringen?
    Zitat Zitat von FLoorfiLLa
    OnAiR gab mir neuen Sinn fürs Leben und half mir Probleme zu lösen von denen ich nichtmal wusste das ich sie habe.
    OnAiR ist einfach super und sollte in keinem Haushalt fehlen!

  3. #3
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    ^^ warn tippfehler, sorry

  4. #4
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    Ein Pluginsystem, das je nach Übergabe andere Klassen (Module) inklusive derer Methoden lädt?

    Das hier könnte eventuell interessant sind.

    Klasse kopieren und mit Referenzen arbeiten:
    http://www.devmag.net/webprog/php_class_nesting.htm

  5. #5
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    dies setzt jedoch vorraus, das ich in jeder klasse auf bestimmte klassen zugreifen muss, zb müsste so jede klasse meine erst per include / require einbinden und dann eine instanz ereugen, was ich sehr daneben finde ...
    außerdem kann die db klasse nicht auf die guestbook klasse zugreifen (außer es wird nur eine statische funktion benötigt) und dieses problem habe ich ja bereits bei meinem system ...

    ich denke ich habe eine prinizpelle lösung des problems

    1. <?php
    2. function _($class,$function,$wert) {
    3. global $$class;
    4. $$class->$function($wert);
    5.  
    6.  
    7. }
    8.  
    9. class bar {
    10.  
    11. function output($a) {
    12.  
    13. $this->output = $a;
    14. $this->real_output();
    15. }
    16.  
    17. function real_output() {
    18.  
    19. echo $this->output;
    20. }
    21.  
    22. }
    23.  
    24. class foo {
    25.  
    26. function input() {
    27.  
    28. _("bar","output","FOOBAR");
    29.  
    30. }
    31. }
    32.  
    33. $bar = new bar();
    34. $foo = new foo();
    35. $foo->input();
    36. ?>

    Ausgabe:
    Code:
    FOOBAR
    jetzt liegt s nur noch daran die function _ zu optimieren, aber das gewollte funktioniert

    EDIT:
    ich habe das ganze mal leicht verfeinert, schau es dir mal an

    1. <?php
    2. function &_($class,$function=NULL,$wert=NULL) {
    3. static $objekt;
    4. $class = explode(",",$class);
    5.  
    6. foreach($class as $load)
    7. if (!is_object($objekt[$load])) {
    8. $objekt[$load] = new $load();
    9. }
    10. if (count($class)==1)
    11. eval ("\$objekt[\$class[0]]->\$function(".@implode(",",$wert).");");
    12. }
    13.  
    14. class bar {
    15.  
    16. function output($a,$b) {
    17.  
    18. $this->output = $b.$a;
    19. $this->real_output();
    20. }
    21.  
    22. function real_output() {
    23.  
    24. echo $this->output;
    25. }
    26.  
    27. }
    28.  
    29. class foo {
    30.  
    31. function input() {
    32.  
    33. _("bar","output",array("BAR","FOO"));
    34.  
    35. }
    36. }
    37.  
    38. _("bar,foo");
    39. _("foo","input");
    40. ?>

    die ausgabe bleibt gleich
    Geändert von Osbes (30.07.2006 um 23:55 Uhr)

  6. #6
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    und hier die neuste version der function ( ich habe paar notice error rausgehauen )

    1. function &_($class,$function=NULL,$wert=NULL) {
    2. static $objekt;
    3.  
    4. $class = explode(",",$class);
    5. if (!is_array($wert))
    6. $wert = array($wert);
    7.  
    8. foreach($class as $load)
    9. if (!isset($objekt[$load])) {
    10. $objekt[$load] = & new $load();
    11. }
    12.  
    13. if (!is_null($function))
    14. eval ("\$objekt[\$class[0]]->\$function('".@implode("','",$wert)."');");
    15.  
    16. $return = NULL;
    17. return $return;
    18.  
    19. }

    was hälst du von dem gedanken ?

  7. #7
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    Ich bin heute erstmal in Sachen Diplomarbeit unterwegs. Vielleicht komme ich heut abend dazu, den neuen Code zu überschauen.

    Gestern hatte ich die "Klasse" mal getestet, die "Unterklassen" erweitert und eine neue eingebaut. Hat eigentlich alles soweit funktioniert.

  8. #8
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    das problem dabei kann ich mal leicht erklären ( am worst case )

    ich schreibe von der hauptebene die xmltpl klasse an,
    diese stellt fest, dass die benötigten datein noch nicht im cache ordner sind und scheißt die cache klasse zusammen, das die mal arbeiten soll.
    diese verbockt es aber und ruft die error klasse auf.
    diese soll jetzt eine individuelle errormsg ausgeben, weshalb sie die nötige template haben will.
    jetzt ist schon wieder die xmltpl klasse am start und stellt abermals fest, das die gecachte datei fehlt und schiebt es wieder der cache klasse zu.
    diese arbeitet es jetzt ab und sendet es an die xmltpl klasse, die es wiederrum an die error klasseschickt.

    das problem ist jetzt, der weg:

    xmltpl -> cache -> error -> xmltpl -> cache

    mit dem ineinanderladen müsste ich 2 mal die cacheklasse für die xmltpl klasse nachladen, da ich a) von der xmltpl klasse der error klasse nicht auf die obere xmltpl klasse zugreifen kann und b) nicht davon ausgehen kann, das zuvor schon mal die xmltpl gearbeitet hatte innerhalb des prozesses.

    es sollt aber möglich sein ohne großen aufwand ständig verbindung zur anderen klasse herzustellen und da man zwar keine andere klasse aus einer klasse direkt ansprechen kann ( wegen der instanz ), aber extern definierte funktionen, lasse ich es jetzt damit laufen, da die funktion wiederum in der lage ist sämtliche klassen anzusprechen und sozusagen die vermittlung darstellt :>

    EDIT
    ich habe sie übrigens nochmal verbessert, eine erweiterte kontrolle ( inkl. fehlermeldung ), bevor eine funktion aufgerufen wird und die möglichkeit dem konstrukt daten zu übermitteln wurde hinzugefügt :>

    1. function &_($class,$function=NULL,$wert=NULL) {
    2. static $objekt;
    3.  
    4. $class = explode(",",$class);
    5. if (!is_array($wert))
    6. $wert = array($wert);
    7.  
    8. foreach($class as $load)
    9. if (!isset($objekt[$load]))
    10. eval ("\$objekt[\$load] = & new \$load('".@implode("','",$wert)."');");
    11.  
    12. if (!is_null($function) && preg_match("%^[-_a-zA-Z]+$%",$function))
    13. if (!preg_match("%^[-_a-zA-Z]+$%",$function))
    14. trigger_error("Ihr Funktionsname ist nicht korrekt.");
    15. else
    16. eval ("\$objekt[\$class[0]]->\$function('".@implode("','",$wert)."');");
    17.  
    18. $return = NULL;
    19. return $return;
    20. }
    Geändert von Osbes (01.08.2006 um 19:41 Uhr)

  9. #9
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    Das hast du dir ja was verwegenes ausgedacht Ist mir in der Form noch nie untergekommen. So etwas haben, wenn überhaupt, nur große CMS.

    Wenn du so intensiv mit der OOP arbeiten willst, dann wirds doch Zeit für PHP 5. Das Konzept von Version 4 ist dafür nicht wirklich ausgelegt.

    Im Grunde könnte man dem Kreiselproblem nach doch der Masterfunktion eine optionale Variable zufügen, die mit einem Initialwert belegt ist, welcher durch Nachricht der zuführenden Klasse geändert werden kann. Dann wäre es doch über ein Kontrollkonstrukt möglich, den gewünschten Weg weiterzuverfolgen.

    Oder häng ich da grad mächtig aufm Schlauch

    Was sagen den Phorkys oder Floorfilla? Mehr Coder rennen hier ja nicht wirklich rum
    Geändert von -Admi- (02.08.2006 um 20:55 Uhr)

  10. #10
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    das grundlegene problem ist jedoch, das php5 leider noch nicht in der masse verbreitet ist, wie ich es gerne hätte und es zu zeitaufwendig wäre noch eine php5 alternative zu formulieren ( durch die besseren möglichkeit in der OOP würden sich ja viele dinge die ich extra machen auflösen und neue möglichkeiten entstehen )

    das problem ist, da du von einer klasse weder per class nesting, noch über extends ( wobei dies sogar fehler verursachen kann ) zu der übergeordneten kommst, da du ja deren instanz ansprechen müsstest und das $this-> innerhalb einer klasse dann nicht mehr der übergeordneten gehört sondern dir und unweigerlich zu einem fehler führt.

    ich habe übrigens einen bug entdeckt,

    1. eval ("\$objekt[\$load] = & new \$load('".@implode("','",$wert)."');");

    muss durch

    1. eval ("\$objekt[\$load] = & new \$load('".((is_null($function) && !is_null($wert)) ? implode("','",$wert) : '')."');");

    ersetzt werden, da meine funktion ein objekt ja erst erzeugen soll, wenn es benötigt wird wäre bei der anderen version, bei der übergabe von werten, ( wenn man gerade eine funktion der klasse ansprechen wollte, die klasse aber nocht nicht einzeln aufgerufen hat ) dem konstrukt ebenalls diese daten gesendet ( was ja nicht sein soll ) und es hätte unverzüglich zu einem error geführt, weshalb jetzt nur noch daten dem konstrukt gesendet werden, wenn man keine funktion ansprechen will ( was man ja nur macht, wenn man das konstrukt ansprechen will ).


    vll werde ich mal für die ubz eine php5 variante schreiben ( der server hier hat ja php5 ), aber derzeit muss die ubz erstmal mit der version leben, die ich auch unter php4 verwenden kann.


    diese ganze OOP geschichte baut übrigens auch auf einem für mich neuem system auf, denn ich will nicht mehr explizit mich auf bestimmte faktoren festlegen, sondern umfassen schreiben, sprich daten für templates etc werden nur noch in xml gespeichert, da ich diese leicht umwandeln kann in andere anzeige formate und die jetzt schon in betrieblaufende qry klasse ( diese erzeugt anhand von werten derzeit gültigen SQL Code ) soll ebenfalls zu jeder datenbank die optionalen befehle lernen um auch dort alternativ arbeiten zu können.

    und ziel ist es dieses system ( gekoppelt an den neuerungen mit dem die meisterschaftseite gerade läuft - für mich isses ne daher testseite ^^ ) zur GB fertig zu stellen und dann damit die neue ubz version ( inkl. teamsystem ) aufzubauen.

  11. #11
    Obergefreiter
    Avatar von PhorkysXT
    Registriert seit
    05.01.2004
    Ort
    Nürnberg
    Alter
    25
    Beiträge
    242
    Nick
    PhorkysXT
    Clans
    UF Alliance
    Zitat Zitat von -Admi-
    Das hast du dir ja was verwegenes ausgedacht Ist mir in der Form noch nie untergekommen. So etwas haben, wenn überhaupt, nur große CMS.

    Wenn du so intensiv mit der OOP arbeiten willst, dann wirds doch Zeit für PHP 5. Das Konzept von Version 4 ist dafür nicht wirklich ausgelegt.

    Im Grunde könnte man dem Kreiselproblem nach doch der Masterfunktion eine optionale Variable zufügen, die mit einem Initialwert belegt ist, welcher durch Nachricht der zuführenden Klasse geändert werden kann. Dann wäre es doch über ein Kontrollkonstrukt möglich, den gewünschten Weg weiterzuverfolgen.

    Oder häng ich da grad mächtig aufm Schlauch

    Was sagen den Phorkys oder Floorfilla? Mehr Coder rennen hier ja nicht wirklich rum
    Ui ui ui, da hat jemand meinen Namen erwähnt. Leider kann ich beim Thema OOP nicht viel sagen, da ich mich selbst erst richtig reinarbeiten muss. Aber das was Osbes da gebastelt hat sieh schon nice aus.. muss ich mir mal genauer anschauen

  12. #12
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    thx aber ich bin derzeit auch relativ zufrieden mit der lösung, aber mal schauen was daraus noch wird :/ ( daher bin ich ja für anregungen immer zu haben )

    achja, wegen dem
    1. $return = NULL;
    2. return $return;

    nicht wundern, dies musste ich hinschreiben, da php sonst einen notice error schreibt, da eine referenz funktion seit 4.3 eine variable über return übergeben muss.

    sonst kommt nämlich
    Code:
    only variable reference should be returned by reference

  13. #13
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    wieso nicht gleich:

    1. return $return=NULL;

    oder

    1. return NULL;

    Dürfte beides ebenso funktionieren.

    Was genau speicherst du jetzt in XML. Die reine Struktur der Seite oder auch Inhalte? Da du ja aber auch eine SQL-Klasse verwendest, dürften die Daten ja weiterhin in der DB liegen und mittels PHP abgerufen und in die XML-Templates eingefügt werden.

    In welche Formate würde den eine Portierung von XML-Daten Sinn machen? PDF´s kann man auch mit der FPDF-Klasse generieren. Officedokumente machen auch wenig Sinn. Interessant könnte ich mir höchstens die Verbindung mit Grafikfunktionen (etwa die SVG-Technologie) vorstellen, damit man Diagramme und andere Grafiken dynamisch aus dem Content generieren kann.

  14. #14
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    return $return=NULL;
    ist nicht gültig und

    return NULL;
    geht nicht, da eine referenz funktion über return seit 4.3 eine variable übergeben muss ( sonst kommt ein notice error, die sind nur normal ausgeblendet E_ALL ^ E_NOTICE )

    XML übernimmt alle templates und alles was ich cachen sollte, da der aufruf + sortierung zulange dauern würde ( zb listen etc )

    ich will vorerst folgene formate unterstützen:
    HTML, XHTML, XML, PDF ( doc wäre natürlichauch ganz lustig, vll sogar eine txt variante ^^ )
    wie man erkennt kann ich damit das format dynamisch halten, je nachdem wie man die seite gerade braucht

    von einer fertigen klasse halte ich nix, das würde ja den spaß nehmen es selbst zu schreiben ( schließlich wächst man ja geade dadurch an erfahrungen und ideen )

    SVG war mir bislang nicht bekannt, es schein recht interesant zu sein, auch wenn ich das anwendungsgebiet noch bedenken muss ( es wird wohl ne art online graphviz werden :> )

  15. #15
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    Bei mir funktioniert beides aber ganz gut - XAMPP PHP Version 5.0.4. Allerdings ohne volles Error Reporting.

  16. #16
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    ich sag ja, es erzeugt enien notice error, welcher nur nicht angezeigt wird

    aber da isser trotzdem

    sonst würde ich das return auch gleich wegfallen lassen ^^

  17. #17
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    Zum Cachen ists natürlich gut machbar. Vorallem die arbeitsintensiven Varianten.
    Obwohl man ja die Abfrage auch begrenzen kann. Wieso ist denn die UBZinterne Mitgliederanzeige rausgefallen (war ja schlichtweg der Kandidat für dieses Thema ) und stattdessen die UF-Variante verlinkt worden?

    Bei Java kriegste sofort einen Fehler (Exception) vom Compiler reingewürgt Insofern kann man in PHP schon ziehmlich viel machen, ohne das es wirklich richtig wäre und trotzdem funktioniert es.

    Neben der Inkonsistenz der Sprache einer der großen Aspekte gegen PHP.

    Hast du schonmal überlegt, dich mit JSP/Servlets (also der serverseitigen Variante) auseinanderzusetzen. Die Unterstützung von XML ist bei JAVA recht gut. Die Funktionsvielfalt größer, die Sicherheit höher, die Performance genauso gut (Beispiel einer AoE3 Community-Seite). Dafür aber auch schwieriger zu verstehen, einfach komplexer als PHP.

  18. #18
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    die jetzige ubz version ist ja noch mit recht alten teilen bestückt, ich denke die mitgliederliste wird dann auch wieder reinkommen, sobald die neue version startbereit ist.

    Man kann natürlich auch auf andere varianten springen, aber ich setze viel in php6 und denke das es der richtige weg ist weiterhin php zu unterstützen in der verbreitung und jetzt nicht mit anderen varianten anzufangen.
    außerdem gibt es viele dinge, die bislang zusätzlich zu der standard php version gepackt werden können, die ebenfalls eine sehr gute xml unterstützung bieten.

    ich denke ich werde demnächst mal eine tplxml variante posten, dann kann man es anschaulicher machen

  19. #19
    UF Supporter
    Avatar von -Admi-
    Registriert seit
    10.09.2004
    Alter
    34
    Beiträge
    6.766
    PHP 6 soll erst irgendwann in 2007 erscheinen und wird einige Neuerungen bringen, aber auch alte Mängel behalten. Hier gibts die Neuigkeiten PEAR verschwindet dann anscheinend auch aus dem PHP-Paket

  20. #20
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.312
    der sinn von php6 ist ja auch noch den ganzen müll loszuwerden der doppelt ist :>

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. C&C 4 Klassen-Trailer
    Von Laura1l im Forum Tiberian Twilight
    Antworten: 10
    Letzter Beitrag: 30.01.2010, 02:39
  2. PHP: handler in klassen ( speziell xml )
    Von Osbes im Forum Technik Ecke
    Antworten: 2
    Letzter Beitrag: 07.09.2006, 21:53
  3. Klassen-Verteilung?!
    Von Rasputin im Forum Rollenspiele
    Antworten: 6
    Letzter Beitrag: 19.02.2005, 20:00
  4. Was spielst du /Klassen
    Von Broadwinn im Forum Rollenspiele
    Antworten: 17
    Letzter Beitrag: 10.02.2005, 22:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •