OO: Verstrikte Vererbung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OO: Verstrikte Vererbung

    Hallo!

    Ich arbeite mit einem XML basierten CMS, welches objektorientiertes PHP verwendet. Man stelle sich vor die Klasse "kontakt" wird aufgerufen, wobei kontakt eine Subclass von der Klasse Extension ist. Die Klasse Extension stellt einige andere Klassen zur Verfügung, wie z.B. db, functions usw. welche gleichzeitig Subclasses von Extension sind. Leider kommen in einer bestimmten Konstellation meine anderen Objekte in der Klasse Functions nicht an.

    Es wird kontaktformular aufgerufen, Extension erstellt das Objekt db und functions:

    PHP-Code:
    include_once $this->scriptroot.'/db.php';
    $this->db = new db($settings->SqlHost,$settings->SqlUser,$settings->SqlPassword,$settings->SqlDb);

    include_once 
    $this->scriptroot.'/functions.php';
    $this->functions = new Functions($this->includeroot); 
    das Objekt kontaktformular greift auf eine Funktion der functions zu ($this->functions->verify() ), und in dieser Funktion wird aber auf die Klasse db zugegriffen und das funktioniert nicht.


    In der functions steht in einer Funktion folgendes,
    PHP-Code:
    $row=$this->db->fetch_array($result
    und das gibt den Fehler "Fatal error: Call to a member function on a non-object in "

    Ich verstehe leider nicht, wieso das nicht klappt. Kann mir das jemand erklären, oder ist es für euch auch unerklärlich?

  • #2
    du erzeugst in der klasse kontakt eine variable, die ein db Objekt beinhaltet

    du erzeugst in der klasse konakt eine variable, die ein functions Objekt beinhaltet


    wenn du in der klasse functions $this verwendest, bezieht sich das auf die instanz der klasse functions und nicht auf die instanz der klassen, deren variable ein functions objekt ist
    Code:
             kontakt
                / \
               |  |
      functions   db
         |
         |
         [color=red]db?[/color]
    du willst auf das rote db Objekt zugreifen, dass du aber nicht erzeugt hast
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      probiers mal mit folgendem:
      PHP-Code:
      $row=parent::db::fetch_array($result); 
      [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
      [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
      [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

      © Harald Schmidt

      Kommentar


      • #4
        @mrhappiness
        Wie kann ich denn auf das andere db zugreifen?

        Code:
         
                 kontakt
                    / \
                   |    |
             functions *db*
        @Troublegum

        PHP-Code:
        return parent::db::query("SELECT *FROM table"); 
        geht leider nicht(return parent::einfacheFunktion() geht aber). Fehler:

        Parse error: parse error, unexpected T_PAAMAYIM_NEKUDOTAYIM

        Habe gelesen man müsste call_user_func() verwenden, wenn dieser Fehler kommt:

        PHP-Code:
        call_user_func(array($class'function'), $param1
        Aber wie muss ich das verwenden, wenn ich das mit parent mache

        PHP-Code:
        call_user_func(array(parent::db'query'), "SELECT subject FROM contactsubjects"
        geht nicht.

        thx

        Kommentar


        • #5
          das parent bezieht sich doch nur auf die basisklasse und da du die klasse functions nich von kontak abgelitet hast seh ich da schwarz

          du könntest höchstens ne refrenz an die functions übergeben
          PHP-Code:
          $this->functions = new Functions($this->includeroot,&$this->db); 
          oder ne kopie
          PHP-Code:
          $this->functions = new Functions($this->includeroot,$this->db); 
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Danke! So gehts.

            Extension.php:

            PHP-Code:
            $this->functions = new Functions(&$this->db); 

            Functions.php:
            PHP-Code:
            function Functions($extensions) {
                
            $this->extension = &$extensions;
            }

            $result $this->extension->db->query("SELECT * FROM table"); 

            Ich wundere mich trotzdem wieso man nicht direkt auf db zugreifen kann. Ist das nicht ein struktureller Mangel in der OO Unterstützung von PHP? Wie sieht es denn in anderen Sprachen damit aus?

            Kommentar


            • #7
              is kein mangel, du siehst halt nur das, was du vorher (mehr oder weniger) statisch deklarierst.

              was du bräuchtest wäre ein owner::db und sowas gibts afaik nirgendwo
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Okay. Jetzt hab ich das Problem mit der mehrfachen Verwendung der Klasse.

                1. Fall:
                Aus einer übergeordneten Klasse "page", wird die functions aufgerufen und dann soll die Funktion getCode ausgeführt werden. Standardmäßig soll dazu der Konstruktur von der Oberklasse Extension benutzt werden(normal hat functions keinen eigenen).

                new Functions(..)
                getCode(..)


                2. Fall
                So wie am Anfang des threads beschrieben: Ein anderes Objekt wird wie im 1. Fall erstellt, welches über den vererbten Konstruktor Zugriff auf die functions bekommen soll.


                Ich hatte der functions einen eigenen Konstruktor spendiert, damit ich die Funktionen von Extension nutzen kann. Wenn jetzt der 1. Fall auftritt, nimmt mein System nicht den Konstruktor von Extension sondern auch den eigenen. Dadurch fehlen natürlich z.B. die db Anbindung.

                1. Lösungsansatz
                Könnte man vom Aufruf abhängig machen, wann welcher Konstruktor benutzt wird?

                2. Lösungsansatz
                Kann ich innerhalb des eigenen Konstruktors, den von Extension aufrufen um $this zu überschreiben?

                Kommentar


                • #9
                  warum solltest du nicht den konstruktor der basisklasse indeinem konstruktor einfach aufrufen können?
                  musst halt nur schauen, ob du den basiskonstruktor vor oder nach dem für deine klasse speziellen zeug aufrufst
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Ich hab jetzt ne Lösung(*selbststolzsei*):

                    Ich habe die Teile des Extension Konstruktors, welche ich benötige in eine eigene Funktion ausgelagert, welche den Rückgabewert $this hat. Dann steht in functions folgendes:
                    PHP-Code:
                                    function Functions($extensions) {
                                     
                    #Referenz auf alle Funktionen von Extension
                                      
                    $this->extension = &$extensions;
                                    }
                                    
                                    function 
                    getCode($paramList) {
                                     
                    #Konstruktor Workaround
                                      
                    $this->extension parent::construct();
                                     
                    #gewünschte Funktion aufrufen
                                     
                    return $this->$paramList['function']($paramList);
                                    } 
                    Ich hoffe, es hat sich gelohnt auf OO umzusteigen, bis jetzt schwanke ich zwischen Begeisterung(wegen der realitätsnähe) und Zweifel(komplexe Struktur).

                    Kommentar

                    Lädt...
                    X