Gegenseitiges Einbinden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gegenseitiges Einbinden

    Hallo,

    da ich eine Klasse in einer Klasse benötige (was ja nichts besonderes ist) binde ich diese per "require_once()" ein. Problem ist nun, dass Klasse A die Klassen B und C einbindet, Klasse B die Klasse A und Klasse C ebenfalls die Klasse A; Beispiel:

    class GxPersonalData
    require_once(WCF_DIR.'lib/data/gnex/Kunde.class.php');
    require_once(WCF_DIR.'lib/data/gnex/Verein.class.php');

    class Kunde
    require_once(WCF_DIR.'lib/data/gnex/GxPersonalData.class.php');

    class Verein
    require_once(WCF_DIR.'lib/data/gnex/GxPersonalData.class.php');


    Leider kann ich darauf nicht verzichten - des weiteren muss die PersonalData-Klasse für sich stehen, da ich sie teilweise auch woanders benötige.

    Als Resultat gibt der ApacheProxy bei einem Seitenaufruf, in der eine der genannten Klassen eingebunden ist, einen "Error reading from remote server"-Error aus. Übersehe ich etwas oder gibt es eine bessere Möglichkeit?


    P.S.: Ja, es ist das "require_once()"-Problem, da beim kommentieren der "require_once()"-Zeilen die Seite normal ausgegeben wird.
  • Hi,

    irgendwie steh ich auf dem Schlauch. Was genau meinst du mit "einbinden" ?

    Wenn es Abhängigkeiten gibt, dann solltest du extend benutzen, oder innerhalb der Klassen die anderen Klassen instanzieren, oder wenn du ein bestimmtes Objekt haben möchtest, das dann dem Konstruktor oder einer anderen Methode übergeben.
  • GneX schrieb:

    Die Klassen sind nicht direkt voneinander abhängig - Ich greife lediglich auf einige Funktionen zu.

    Könnte man mit statischen Methoden lösen.

    Hast du nur ein Problem mit dem einbinden ? Denn du schreibst, die sind nicht direkt voneinander abhängig, aber binden sich gegenseitig ein ?!

    da ich eine Klasse in einer Klasse benötige

    Was meinst du damit ?


    Erläuter das gesamte Problem mal ein bischen mehr und lass dir nicht alles aus der Nase ziehen ;)
  • Ja, es ist nicht ganz so einfach zu erklären und mir auch neu ;)
    Um in der Klasse A auf die Klassen B und C zugreifen zu können, binde ich diese in die Klasse A ein. Nun muss ich aber in den Klassen B und C auf die Klasse A zugreifen, also ist die Klasse A un den Klassen B und C ebenfalls eingebunden.

    Klasse A > B & C
    Klasse B > A
    Klasse C > A

    Somit bindet sich die Klasse A selber in sich ein, denn Klasse A ist ja in Klasse B und C eingebunden und Klasse B und C wiederum in Klasse A. Ebenso ist dies in Klasse B und in Klasse C der Fall.

    Nehme ich nun aus Klasse A die Einbindung der Klassen B und C heraus, funktioniert Klasse A. Nehme ich aus Klasse B und C die Einbindung der Klasse A raus, so funktionieren diese auch.
  • Mittlerweile bin ich am verzeifeln. Wenn ich in die Klasse A, die Klasse B einbinden, erhalte ich einen 502-Proxy-Error (Keine Rückgabewert / Rückgabe 0).

    Aufbau:
    Klasse A > require_once() > Klasse B
    Klasse B > require_once() > Klasse A


    Hat wirklich niemand eine Idee, wieso ich diesen Fehler bekomme? Die Dateien haben jeweils eine andere Zeichencodierung; ich habe beide auf die selbe gebracht > Problem besteht immer noch.
  • Hey,

    ich habe gerade kein Apache hier. Würde jetzt aber einfach folgendes Testen um den Fehler einzubinden:

    A.php

    Quellcode

    1. <?php
    2. require_once("B.php");
    3. require_once("C.php");
    4. print "hello world - file A";
    5. ?>


    B.php

    Quellcode

    1. <?php
    2. require_once("A.php");
    3. print "hello world - file B";
    4. ?>


    C.php

    Quellcode

    1. <?php
    2. require_once("A.php");
    3. print "hello world - file C";
    4. ?>


    Sollte der Fehler hier auch auftauchen kann man schonmal davon ausgehen, das der Fehler an dem gegenseitigem Einbinden liegt (schleife). Wenn das der Fall ist, würde ich mir eine eigene Funktion schreiben, die sich merkt, welche Dateien schon eingebunden wurden und dann nicht mehr einbindet.

    Wenn das Beispiel Funktioniert hast du irgendwo in deinem Code einen anderen Wurm drinnen.


    Wie gesagt, ich würde es schnell testen hab aber gerade kein Apache+PHP da...

    Gruß,
    Erasel
    My lovely mister singing club...
  • Der Test hat funktioniert ... Aber ich sehe auch keinen Fehler in meinen Klassen. :(

    // Edit: require_once() funktioniert, aber sobald ich eine neue Instanz (new A()) aufrufe bekomme ich den 502-Fehler.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GneX ()

  • Die habe ich mir angesehen und folgende Einträge machen mich stuzig:

    Quellcode

    1. [Sat Feb 06 19:19:41 2010] [notice] child pid 4025 exit signal Segmentation fault (11)
    2. [Sat Feb 06 19:19:44 2010] [notice] child pid 4034 exit signal Segmentation fault (11)
    3. [Sat Feb 06 19:19:47 2010] [notice] child pid 4008 exit signal Segmentation fault (11)
    4. [Sat Feb 06 19:20:00 2010] [notice] child pid 4014 exit signal Segmentation fault (11)
    5. [Sat Feb 06 19:20:08 2010] [notice] child pid 4011 exit signal Segmentation fault (11)
    6. [Sat Feb 06 19:20:15 2010] [notice] child pid 4015 exit signal Segmentation fault (11)
    7. [Sat Feb 06 19:20:19 2010] [notice] child pid 4004 exit signal Segmentation fault (11)
    8. [Sat Feb 06 19:20:20 2010] [notice] child pid 4199 exit signal Segmentation fault (11)
    9. [Sat Feb 06 19:20:27 2010] [notice] child pid 4017 exit signal Segmentation fault (11)
    10. [Sat Feb 06 19:21:07 2010] [notice] child pid 4367 exit signal Segmentation fault (11)
    11. [Sat Feb 06 19:22:07 2010] [notice] child pid 4366 exit signal Segmentation fault (11)
    12. [Sat Feb 06 19:23:08 2010] [notice] child pid 4203 exit signal Segmentation fault (11)
    Alles anzeigen



    Eine komplette Neuinstallation von PHP5 brachte leider keine Besserung.
  • Hi,

    da, die Pfade und Dateinamen stimmen alle überein. Um euch vielleicht noch ein wenig mehr Einblick zu gewähren (ganze Dateien kann ich nicht zur Verfügung stellen, da einige Funktionen geheim bleiben müssen/sollen):

    d0nut (und eventuell der ein oder andere) kennt das WCF und sollte sich das folgende daher vorstellen können (stark vereinfachte Darstellung):

    Ich habe die folgenden Klassen:
    - Kunde.class.php
    - Verein.class.php
    - GxPersonalData.class.php

    Klasse "Kunde.class.php":

    Quellcode

    1. require_once(WCF_DIR.'lib/data/gnex/GxPersonalData.class.php');
    2. public function handleData($data) {
    3. parent::handleData($data);
    4. /* Funktioniert nicht, Error 502: */
    5. $this->gxPersonalData = new GxPersonalData($this->userID);
    6. /* Funktioniert (weil nicht aktiv) */
    7. #$this->gxPersonalData = new GxPersonalData($this->userID);
    8. }
    Alles anzeigen


    Klasse "Verein.class.php":

    Quellcode

    1. require_once(WCF_DIR.'lib/data/gnex/GxPersonalData.class.php');
    2. public function handleData($data) {
    3. parent::handleData($data);
    4. /* Funktioniert nicht, Error 502: */
    5. $this->gxPersonalData = new GxPersonalData($this->userID);
    6. /* Funktioniert (weil nicht aktiv) */
    7. #$this->gxPersonalData = new GxPersonalData($this->userID);
    8. }
    Alles anzeigen


    Klasse "GxPersonalData.class.php":

    Quellcode

    1. require_once(WCF_DIR.'lib/data/gnex/Kunde.class.php');
    2. require_once(WCF_DIR.'lib/data/gnex/Verein.class.php');
    3. public function handleData($data) {
    4. parent::handleData($data);
    5. /* Funktioniert nicht, Error 502: */
    6. $this->kunde = new Kunde($this->userID);
    7. $this->verein = new Verein($this->userID);
    8. /* Funktioniert (weil nicht aktiv) */
    9. #$this->kunde = new Kunde($this->userID);
    10. #$this->verein = new Verein($this->userID);
    11. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GneX ()

  • Hi,

    kannst du nicht die includes aus den Klassen rausnehmen und global setzen ?
    Du bindest GxPersonalData.class.php ein. Dort wird die Verein.class.php eingebunden, welche GxPersonalData.class.php einbindet und die Verein.class.php einbindet, welche GxPersonalData.class.php einbindet und ...... ;)

    edit:
    ok, das is ja *_once da sollte das egal sein. Mein Fehler.
  • Möglich ja, aber mit nicht gerade geringem Aufwand verbunden (und ich bin eher jemand, der nicht gerne an die 70 Dateien bearbeitet) ;)
    Aber am einbinden kann es eigentlich nicht liegen; Der Fehler wird ja - nachdem ich auch erst dachte, dass es an den includes liegt - erst durch das erzeugen einer neuen Instanz hervorgerufen.

    Bisher habe ich aber auch auf php.net keinen Lösungsansatz gefunden.
  • Hey,


    ich bin mir da nach wie vor nicht sicher ob es nur an dem include liegt. Reine Theorie: Kann es auch daran liegen, das du die Klassen gegenseitig initialisierst? Klasse A initialisiert Klasse B und C und die Initialisieren wiederum Klasse A welche wieder Klasse B und C... Evtl. musst du den SingelTonPattern anwenden und prüfen ob die Klasse schon existiert...
    Der Test hat ja gezeigt, das gegenseitiges Einbinden kein Problem ist... Ich würde das auch gerne testen weil ich das auch sehr interessant finde. Hab nur leider keine Entwicklungsumgebung zur Hand.
    Evtl. kann ich morgen in der Arbeit aber nochmal schauen...

    Gruß,
    Erasel
    My lovely mister singing club...
  • Ist schon möglich, werd's mir gleich auch nochmal genauer ansehen, aber was mich aber stutzig macht ist, dass ich es beim CliquenPlugin so ähnlich habe:

    Die CliquenClass bindet die CliquenPermissionsClass ein, die CliquenPermissionsClass wierrum die CliquenClass. Dabei wird in der CliquenClass eine neue Instanz der CliquenPermissionsClass und in der CliquenPermissionsClass eine neue Instanz der CliquenClass aufgerufen. Funktioniert ohne Probleme.