mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 13:11 Benutzername: Passwort: Auto-Login

Thema: Dynamische Bindung mit PHP4 vom 14.09.2006


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Dynamische Bindung mit PHP4
Seite: 1, 2, 3  Weiter
Autor Nachricht
rueckblick
Threadersteller

Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 14.09.2006 19:04
Titel

Dynamische Bindung mit PHP4

Antworten mit Zitat Zum Seitenanfang

Hallo,

also bei google habe ich nichts gefunden, was mir weiterhilft. Ich möchte unter PHP4 objektorientiert schreiben und brauche nun auch dynamische Bindung.

Kann man das irgendwie in PHP4 umsetzen?

Zuerst sind mir variable Variablen eingefallen, aber das lass ich doch lieber. Ist ja auch nicht wirklich dynamische Bindung. Aber ich weiß ja auch nicht, ob das überhaupt geht.

Kann mir jemand helfen bitte?
  View user's profile Private Nachricht senden
tacker

Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht: Männlich
Verfasst Do 14.09.2006 20:13
Titel

Antworten mit Zitat Zum Seitenanfang

Was ist denn eine dynamische Bindung?
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
rueckblick
Threadersteller

Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 14.09.2006 20:22
Titel

Antworten mit Zitat Zum Seitenanfang

Also ich hab jetzt eine Möglichkeit entdeckt, in einem Buch von MuT. "Die praktische Referenz PHP5"

Allerdings ist in PHP5 die Schreibweise etwas einfacher, ich habs PHP4 kompatibel gemacht und es geht:
Code:

    require_once './MySQL.php';
    require_once './Postgre.php';

function newObj($typ)
{
  return class_exists($typ) ? new $typ() : 0;
}

$obj = &newObj('MySQL');

$obj->getFunc();
 




In den beiden Klassen gibt es jeweils eine gleichnamige Methode getName().


Das Beispiel
http://de.php.net/manual/en/keyword.parent.php

trifft es nicht ganz, was mit dynamischer Bindung gemeint ist. Dynamische Bindung ist nicht an Vererbung gebunden.

Diese switch Lösung hier ist auch nicht das gelbe vom Ei, aber es kommt der dynamischen Bindung recht nahe. So hat man es auch in C++ ganz früher gemacht.

edit:
habe den code optimiert und die switch Anweisung durch die Funktion class_exists() ersetzt.


Zuletzt bearbeitet von rueckblick am Do 14.09.2006 20:33, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
tacker

Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht: Männlich
Verfasst Do 14.09.2006 22:10
Titel

Antworten mit Zitat Zum Seitenanfang

Hm, sieht für mich aus wie das Factory-Pattern.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
rueckblick
Threadersteller

Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 14.09.2006 23:07
Titel

Antworten mit Zitat Zum Seitenanfang

Du hast recht, und ich habe jetzt sogar gesehen, dass es bei wikipedia einen Link dazu gibt, wie die factory method in PHP umgesetzt werden kann.

Danke, für den Tipp.

Ich habe jetzt über wikipedia einen Link entdeckt, der die Fabrikmethode in PHP erklärt. Ich bzw. wir waren sehr nah dran schon, jetzt hab ichs endlich wie ichs brauche...

Das Programm ansich
Code:


    require_once './classes/DB.php';
    require_once './classes/MYSQL.php';
    require_once './classes/POSTGRESQL.php';

    $oDB = new DB('MYSQL');

    $oDB = $oDB->getObject();

    $oDB->getDB();




Klasse DB mit der factory method umgesetzt. Im Konstruktor wird das jeweilig gewünschte konkrete Objekt erzeugt und getObject() gibt die Referenz auf das Objekt zurück.
Code:

    class DB
    {
      // data elements
      /**
      * Type of database
      * Example:
      *
      * @var object Database type.
      */
      var $oDB;
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      /**
      * standard constructor
      */
      function DB($type)
      {
        $this->oDB = ( class_exists($type) ) ? new $type() : NULL;
      }
     
      function & getObject()
      {
        return $this->oDB;
      }
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    }



und hier die 2 DB Klassen MYSQL und POSTGRESQL mit der gleichnamigen Methode getDB().

Code:

    class MYSQL
    {
      function getDB()
      {
        echo 'MYSQL';
      }
    }




Code:
    class POSTGRESQL
    {
      function getDB()
      {
        echo 'POSTGRESQL';
      }
    }



Ok, dynamische Bindung ist das jetzt doch nicht. Sorry.


Zuletzt bearbeitet von rueckblick am Do 14.09.2006 23:41, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden
tacker

Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht: Männlich
Verfasst Do 14.09.2006 23:41
Titel

Antworten mit Zitat Zum Seitenanfang

Was willst Du denn eigentlich erreichen?
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
rueckblick
Threadersteller

Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 14.09.2006 23:53
Titel

Antworten mit Zitat Zum Seitenanfang

@tacker
Ich versuche eine Art eigene DB Abstraktionslösung zu basteln. Ich weiß es gibt schon gute Lösungen wie PEAR:GrinsB, AdoDB, PDO, etc., aber ich brauche nur wenig Funktionaliltät und deshalb der Eigenversuch.

Letztlich möchte ich in meinem Programm die Möglichkeit herstellen, dass man jederzeit ohne Probleme das Programm ohne Umschreiben mit versch. Datenbanken nutzen kann.

Das erreiche ich jetzt mit der Fabrikmethode. Ich muss nur in den konkreten Klassen MYSQL, POSTGRESQL, ORACLE, etc. immer gleichnamige Methoden verwenden, deren Implementierung aber natürlich dann speziell ne nach Datenbanktyp ist, d.h. mit den PHP funktionen für die jeweilige Datenbank arbeitet. (mysql_, pg_, odbc_, etc.)

Für die Instanziierung für das DB Objekt ist keine eigene Klasse (hier DB) nötig, eine Funktion würde reichen, deswegen ja auch factory method. Also da schau ich mal, ob mir die Klasse DB noch was bringt oder ob ich sie doch verwerfe.


Ich meine aber mit dynamischer Bindung würde das noch eleganter gehen. Und da gibts auch ein Muster, entweder Composite oder Bridge Pattern.
Was meint ihr dazu?
  View user's profile Private Nachricht senden
Account gelöscht


Ort: -
Alter: -
Verfasst Fr 15.09.2006 06:52
Titel

Antworten mit Zitat Zum Seitenanfang

Zwar hat das entfernt was mit dynamischer Bindung zu tun, allerdings ist im Falle PHP so gut wie alles "dynamisch" gebunden, da die Sprache nunmal erst zur Runtime compiliert wird (natürlich gibts auch cachingsysteme...). Ich seh da keine so klare Grenze wie in (vor-)zu kompilierenden "Hochsprachen".

Du willst sicher eher eine Basisschnittstelle haben, die alle Spezialisierungen implementieren. Diese Implementierung willst du nur einmal instanziieren (Singleton-Pattern). Das ist auch der Grund, warum die meisten PEAR-Klassen nicht mittels new object(), sondern mit dem statischen Aufruf $KLASSE::getObject(); instanziiert werden. Die Unterscheidung innerhalb der dann aufgerufenen Factorymethode wird natürlich durchs sog. "late Binding" bzw. dynamisches Binden erst ermöglicht.

Einfach mal - wie bereits getan - nach den entspr. Entwurfsmustern googlen oder sich mal ne PEAR-Klasse anschauen. Viel Spaß dabei, ich bekomm da manchmal Hirnkrebs. Vorsicht: Wie du bereits erkannt hast, kommt in PHP4 noch mehr Syntax durch die explizit auszuzeichnenden Referenzen hinzu.


Zuletzt bearbeitet von am Fr 15.09.2006 07:13, insgesamt 2-mal bearbeitet
 
 
Ähnliche Themen Unterschied php4 - php5
PHP4 oder PHP5
PHP4 oder PHP5?
[PHP4 -> PHP5] Formular funktioniert nicht mehr
Dynamische PDF ?
Dynamische HP
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2, 3  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.