.seamonkey.: Objekt zur Laufzeit um Funktion erweitern

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.

  1. 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

    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen