php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.03.2011, 08:50  
Neuer Benutzer
 
Registriert seit: 08.03.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
dannN befindet sich auf einem aufstrebenden Ast
Standard 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!
dannN ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.03.2011, 09:17  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
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...
fab ist offline   Mit Zitat antworten
Alt 08.03.2011, 09:42  
Neuer Benutzer
 
Registriert seit: 08.03.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
dannN befindet sich auf einem aufstrebenden Ast
Standard

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
dannN ist offline   Mit Zitat antworten
Alt 08.03.2011, 09:56  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

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.
fab ist offline   Mit Zitat antworten
Alt 08.03.2011, 09:56  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

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.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 08.03.2011, 10:22  
Neuer Benutzer
 
Registriert seit: 08.03.2011
Beiträge: 3
PHP-Kenntnisse:
Anfänger
dannN befindet sich auf einem aufstrebenden Ast
Standard

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?
dannN ist offline   Mit Zitat antworten
Alt 08.03.2011, 10:36  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

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
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 08.03.2011, 10:46  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

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 ).
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (08.03.2011 um 10:50 Uhr).
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] OOP - Klassen richtig Designen, aber wie? Yamo PHP Einsteiger 8 01.01.2011 12:03
Wozu brauche ich eigentlich eine abstrakte Klasse? echo PHP Tipps 2010 28 24.11.2010 17:10
[Erledigt] Wie Objekte von Klassen zusammenführen total2121 PHP Tipps 2009 6 19.10.2009 14:22
Mehrere Klassen verknüpfen BlackJack01090 Software-Design 9 26.05.2009 20:43
Modulare Programmierung - Klassen nur in Klassen Gültig iXtends Software-Design 6 26.05.2009 15:37
Fragen zu Klassen Kein Genie PHP Tipps 2006 3 08.05.2006 11:25
Sessions an includete Klassen übergeben Dr_Enquinox PHP Tipps 2006 4 29.04.2006 10:25
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
Klassen und OOP Problem PHP-Fortgeschrittene 3 08.09.2005 10:37
PHP und Klassen Erweitern PHP-Fortgeschrittene 1 25.07.2005 17:57
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
Klassen PHP Tipps 2005 5 09.04.2005 18:51
Klassen in Klassen verwenden PHP Tipps 2005 5 23.02.2005 14:08
Klassen in PHP PHP Tipps 2004 4 12.08.2004 13:17

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php extends mehrere klassen, php klasse erweitern, php 2 klassen in klasse laden, php klassen erweitern, www.:/haupt-klasse.de, php class mehrere extends, mehrere extends php, haupt-klasse.de, php klassen um mehrere klassen erweitern, www.haupt-klasse.de, haupt-klasse, php mehrer klassen erweitern, php extends in meheren klassen, php klassen mehrere extends, eine klasse um mehrere klassen erweitern?, php mehrere klassen extends, php class extends mehrere class, php class ergänzen, php mehrere extends, mehrere klassen erweitern php

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:28 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum