Objekt zur Laufzeit um Funktion erweitern
.seamonkey.
- php
Hi,
ich schlage mich hier grade mit einem etwas merkwürdigen Problem rum: Wir arbeiten mit ADODB welches uns die Datenbankfunktionalitäten zur verfügung stellt. Problem momentan ist: bei jedem aufruf der funktion execute (diese übergibt den sql-query an die DB) soll zusätzlich noch eine von uns spezifizierte Funktion aufgerufen werden. Ableiten von den ADODB-Klassen ist nicht möglich da deren Objekte dynamisch und je nach Datenbank erzeugt werden. Gibt es in PHP die Möglichkeit ein bestehendes Objekt zur Laufzeit um eine Funktion zu erweitern? Oder so etwas wie global zu definieren das beim Aufruf von Funtion xy auch noch funktion yz mit aufzurufen?
schönen Gruß und vielen Dank für tipps, ideen anregungen usw.
.seamonkey.
Hey,
dein eigentliches Problem scheint eher ADODB zu sein und nicht PHP.
[...] Gibt es in PHP die Möglichkeit ein bestehendes Objekt zur Laufzeit um eine Funktion zu erweitern?
Normalerweise wäre hier das Stichwort "typecasting", aber mit Objekten
klappt das in PHP nicht besonders (= nicht erlaubt), man kann bestenfalls
Objekte in Arrays eintauschen.
[...] bei jedem aufruf der funktion execute (diese übergibt den sql-query an die DB) soll zusätzlich noch eine von uns spezifizierte Funktion aufgerufen werden. Ableiten von den ADODB-Klassen ist nicht möglich [...]
An der Stelle wär's sicher das einfachste, ein wenig in ADODB
herumzueditieren. Andernfalls kannst du nur noch eine wrapper-Funktion
einsetzen, der das ADODB-Objekt übergeben wird und die dann automatisch
deine zusätzliche Funktion ausführt (nachdem $obj->execute aufgerufen
wurde).
function bonus_execute(&$obj, $sql, $param1) {
$r = $obj->execute($obj, $param1);
zusatz_fkt($obj, $r);
return($r);
}
MsF,
milky
Hello,
ich mache das in einem Quasi-Objektmodell. Die Funktionen stehen in den Datenbankobjekten selber drin, bzw. in deren Klassen-Datensätzen. Da kann es schon mal vorkommen, dass es mehrere Daensätze derselben Klasse gibt und die Funktion daher schon geladen war. Das kann man aber mit function_exists() http://de2.php.net/manual/de/function.function-exists.php vorher abfragen und wenn sie eben schon da ist, wird sie nicht nochmal evaluiert mit eval() http://de2.php.net/manual/de/function.eval.php
Funktioniert bisher tadellos. Wie man es im "echten OOP-Modell" von PHP 4.x nun macht, kann ich derzeit nicht nachvollziehen. Damit beschäftige ich mich erst bei PHP 5.x stable. Dann ist OOP bei PHP erwachsen und lohnt sich wirklich.
Liebe Grüße aus http://www.braunschweig.de
Tom