Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrere Klassen auf eine Hauptklasse erweitern.

Einklappen

Neue Werbung 2019

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

  • Mehrere Klassen auf eine Hauptklasse erweitern.

    Hallo,
    zunächst vielen Dank für eure Hilfe.

    Ich möchte mehrere Klassen(B)(C) auf eine Hauptklasse(A) erweitern die wiederum die Module-Klasse(Z) erweitert, ohne das $this überschrieben wird, wenn beide Klassen(B)(C) auf der selben seite eingebunden werden.

    http://nopaste.php-q.net/463959

    Ich prüfe in der Klasse (messageList: B) auf getAjaxResponse(). Dies funktioniert auch wunderbar und er arbeitet die methode korrekt ab.

    Wenn ich nun jedoch eine weitere Klasse (messageNew: C) mit einbinde, sind die methoden von der Klasse (B) nicht mehr mit $this->method() aufrufbar, da dies klassen alphabetisch aufgerufen werden und so das $this überschrieben wird.

    Kann ich dies nun so lösen, das der extend von (B) und (C) auf die Klasse (A) gemacht wird, und getAjaxResponse von (B) und (C), und vl noch weiteren klassen die methoden mit $this aufrufen kann?

    Vielen Dank!

  • #2
    Zitat von dannN Beitrag anzeigen
    Wenn ich nun jedoch eine weitere Klasse (messageNew: C) mit einbinde, sind die methoden von der Klasse (B) nicht mehr mit $this->method() aufrufbar, da dies klassen alphabetisch aufgerufen werden und so das $this überschrieben wird.
    Wie bitte? Du stellst hier wilde Mutmaßungen in den Raum, die weit von der tatsächlichen Funktionsweise von PHP entfernt sind. So kann man dir nicht helfen. Versuche mal, dein Problem konkret zu beschreiben (was machst Du, was erwartest Du, was passiert), ohne dabei irgendwelche Annahmen zu machen von denen Du dir nicht sicher bist...

    Kommentar


    • #3
      Das sind keine Mutmaßungen, sondern ich weiß es einfach nicht besser.

      Wenn ich Klasse B und C auf einer Seite einbinde, kann ich mit dem getAjaxRequest nur noch auf die methoden von der Klasse C zugreifen. Die von der Klasse B sind nicht mehr mit $this-> zu erreichen.

      Daher meine Frage, was ich falsch mache, bzw. warum ich mit $this nicht alle methoden der Klassen, die einen extend auf die Klasse A machen, aufrufen kann?

      Vielen Dank

      Kommentar


      • #4
        Also wenn ich dich richtig verstehe, versuchst du aus einem Objekt der Klasse C eine Methode der Klasse B aufzurufen, ohne dass B von C erbt, das ist schlicht nicht möglich. Informiere dich mal über die Funktionsweise von Vererbung und auch den Unterschied zwischen Klassen und Objekten, dir fehlt es offenbar an den Grundlagen der Objektorientierten Programmierung.

        Kommentar


        • #5
          Weil Vererbung in PHP (nicht nur dort) bedeutet, dass die Kindklasse (Kindklasse extends Elternklasse) die entsprechend sichtbaren Teile der Elternklasse kennt, aber nicht die entsprechend sichtbaren Teile anderer Kindklassen, die von dieser Elternklasse erben.

          Anders gesagt: Es sind einer erbenden Klasse nur hierarchisch übergeordnete Elemente bekannt, nicht nebengeordnete.

          - http://www.php.net/manual/en/languag...nheritance.php

          Als Tipp für dein Beispiel: Falls messageList und messageNew keine untereinander gleichberechtigten Module vom Typ viPortalModule sind, bist du mit deiner Klassenhierarchie auf dem Holzweg.

          Kommentar


          • #6
            Ok, das hab ich verstanden.

            Nun hätte ich noch die Frage, wie ich das dann mit dem getAjaxResponse() lösen kann.
            Dieser versucht nun methoden von messageNew zu verwenden, da messageNew ja nach messageList aufgerufen wird, die natürlich wie ihr gerade erklärt habt nicht abrufbar sind.

            Kann ich meine Klassen nun so umbauen, das alle methoden von messageNew und messageList verfügbar sind?

            Kommentar


            • #7
              geh nicht von Kindklasse X aus , sondern bau das in der Elternklasse auf - dort kannst du dann feststellen, um welche Kindklasse exakt es sich handelt und deren passende Methode aufrufen

              Kommentar


              • #8
                Gaaaaaaanz grob vielleicht so:

                PHP-Code:
                <?php

                //viPortalModule.php
                class viPortalModule extends Module
                {
                    protected 
                $ajaxMethodHandlers = array();

                    public function 
                addAjaxMethodHandler(AjaxMethodHandler $handler)
                    {
                        
                $handler->setModule($this);
                        
                $this->ajaxMethodHandlers[] = $handler;
                    }

                    
                /**
                     * Check if there is an ajax response
                     */
                    
                public function dispatchAjaxRequest()
                    {
                        if (
                $this->Input->get('isAjax') == && $this->isAjax())
                        {
                            
                $method = (strlen($this->Input->get('method')))
                                ? 
                'ajax'.ucwords($this->Input->get('method'))
                                : 
                'ajax'.ucwords($this->Input->post('method'));

                            
                $dispatched false;

                            foreach (
                $this->ajaxMethodHandlers as $handler) {
                                if (
                method_exists($handler$method)) {
                                    
                $handler->$method();
                                    
                $dispatched true;
                                    break;
                                }
                            }

                            if (!
                $dispatched) {
                                throw new 
                Exception($GLOBALS['TL_LANG']['ERR']['noAjaxMethod']);
                            }

                            exit;
                        }
                    }


                    
                /**
                     * Check for a true ajax request
                     */
                    
                public function isAjax()
                    {
                        return (isset(
                $_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest');
                    }
                }
                ?>


                <?php

                abstract class AjaxMethodHandler
                {
                    protected 
                $module null;
                    
                    public function 
                getModule()
                    {
                        return 
                $this->module;
                    }

                    public function 
                setModule(Module $module)
                    {
                        
                $this->module $module;
                    }
                }

                //viPortalModule_messageList.php
                class viPortalModule_messageList extends AjaxMethodHandler
                {
                    
                /**
                     * Mark a message as unread
                     * isAjax=1
                     */
                    
                public function ajaxMessageUnread()
                    {
                        
                $this->module->Database
                            
                ->prepare("UPDATE ".$this->module->strTable." SET isRead = ? WHERE MD5(id) = ?")
                            ->
                executeUncached(0$this->module->Input->post('id'));

                        
                $checkSuccess $this->module->Database
                            
                ->prepare("SELECT isRead FROM ".$this->module->strTable." WHERE MD5(id) = ?")
                            ->
                execute($this->module->Input->post('id'));

                        echo (
                $checkSuccess->isRead == 0) ? '@success' '@error';
                    }
                }
                ?>


                <?php
                //viPortalModule_messageNew.php
                class viPortalModule_messageNew extends AjaxMethodHandler
                {
                }

                ?>


                <?php

                $myModule 
                = new viPortalModule();
                $myModule->addAjaxMethodHandler(new viPortalModule_messageList());
                $myModule->addAjaxMethodHandler(new viPortalModule_messageNew());
                $myModule->dispatchAjaxRequest();
                Diejenigen Anwendungsteile, die die Logik zur Bearbeitung eines Ajax-Requests enthalten, werden extern definiert und dem entsprechenden Modul als mögliche „Event-Handler“ zugewiesen. Jeder Handler kennt zudem das zugehörige Modul und kann über die entsprechende Instanzvariable auf weitere Variablen/Methoden des Moduls zugreifen.

                Das ist allerdings jetzt eine relativ allgemeine Designfrage, die kaum objektiv oder zufriedenstellend zu beantworten ist und die vor allem auch vom konkreten Zweck all dieser Klassen abhängt, der für uns nur schwer zu beurteilen ist.

                Das hier ist also nur eine Idee (und vermutlich keine besonders gute ).

                Kommentar

                Lädt...
                X