Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
rueckblick
Threadersteller
Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Do 14.09.2006 19:04
Titel Dynamische Bindung mit PHP4 |
|
|
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?
|
|
|
|
|
tacker
Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht:
|
Verfasst Do 14.09.2006 20:13
Titel
|
|
|
Was ist denn eine dynamische Bindung?
|
|
|
|
|
Anzeige
|
|
|
rueckblick
Threadersteller
Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Do 14.09.2006 20:22
Titel
|
|
|
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
|
|
|
|
|
tacker
Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht:
|
Verfasst Do 14.09.2006 22:10
Titel
|
|
|
Hm, sieht für mich aus wie das Factory-Pattern.
|
|
|
|
|
rueckblick
Threadersteller
Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Do 14.09.2006 23:07
Titel
|
|
|
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
|
|
|
|
|
tacker
Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht:
|
Verfasst Do 14.09.2006 23:41
Titel
|
|
|
Was willst Du denn eigentlich erreichen?
|
|
|
|
|
rueckblick
Threadersteller
Dabei seit: 15.01.2006
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Do 14.09.2006 23:53
Titel
|
|
|
@tacker
Ich versuche eine Art eigene DB Abstraktionslösung zu basteln. Ich weiß es gibt schon gute Lösungen wie PEAR:B, 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?
|
|
|
|
|
Account gelöscht
Ort: -
Alter: -
|
Verfasst Fr 15.09.2006 06:52
Titel
|
|
|
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
|
|
|
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.
|
|