pl: Implementierung eines Interface und Vererbung

Beitrag lesen

hi @MB

Die Erzeugung eines SQL Statements (String) lässt sich auch über ein Interface lösen. Das reduziert den ganzen Code auf 2 Klassen:

# SQL zum Auslesen eines Thread
$m = new Thread(array(
    'threadid' => 2,
    'tabn'     => 'tunguskaforum',
    'fields'   => array('mesgid','author','subject','mesg','mesgdate'),
    'orderby'  => 'mesgdate'
));

# Rufe die Methoden des Interface auf
$m->select();
$m->from();
$m->where();
$m->order();
$m->limit();

# Das Interface ist hier eine Klasse
class SqlString{
    # SQL Fragmente erfassen
    function __construct($frag){
        $this->FRAG = $frag; 
    }
   
    function select(){}
    function from(){}
    function where(){}
    function order(){}
    function limit(){}
    function between(){}
    function join(){}
}

# Spezialisiere die Aufgabe
# durch Überlagerung der Interfacemethoden
class Thread extends SqlString{
    function select(){
        echo "SELECT ".join(", ", $this->FRAG['fields']);
    }
    function from(){
        echo " FROM ".$this->FRAG['tabn'];
    }
    function where(){
        echo " WHERE threadid = ".$this->FRAG['threadid'];
    }
    function order(){
        echo " ORDER BY ".$this->FRAG['orderby']." DESC";
    }
}

Ergebnis:

SELECT mesgid, author, subject, mesg, mesgdate 
FROM tunguskaforum WHERE threadid = 2 
ORDER BY mesgdate DESC

Also, je nachdem welches Statement gebaut werden soll, wird eine Instanz der entsprechenden Subklasse erzeugt. Ich habe hier die Ausgabe mal ins echo gepuffert, natürlich kann man das Ergebnis als String auch in einer Eigenschaft der Instanz puffern und dann mit __toString() ausgeben.

Das Prinzip: Zum Erzeugen beliebiger SQL Strings werden nacheinander einfach nur die Methoden eines Interface aufgerufen was hier als eine Klasse implementiert ist. Und: Es werden immer alle Methoden in der gleichen Reihenfolge aufgerufen.

MFG