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!
Ankündigung
Einklappen
Keine Ankündigung bisher.
Mehrere Klassen auf eine Hauptklasse erweitern.
Einklappen
Neue Werbung 2019
Einklappen
X
-
Mehrere Klassen auf eine Hauptklasse erweitern.
Stichworte: -
-
Gaaaaaaanz grob vielleicht so:
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.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') == 1 && $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();
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
).
-
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
Einen Kommentar schreiben:
-
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?
Einen Kommentar schreiben:
-
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.
Einen Kommentar schreiben:
-
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.
Einen Kommentar schreiben:
-
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
Einen Kommentar schreiben:
-
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...Zitat von dannN Beitrag anzeigenWenn 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.
Einen Kommentar schreiben:

Einen Kommentar schreiben: