PHP funktionen staffeln ( $obj->f1()->f2(); )
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
attribut
beispiel
code
erstellt code
fachbegriff
freuen
funktion
funktionieren
instanz
klasse
konzept
krieg
ordern
reduzieren
sache
schreibarbeit
test
tip
url
zugriff
-
Hallo ihr.
Wollte mal anfragen, wie man mehrere funktionen einer Klasse staffeln kann. Wollte mir einen kleinen SQL- helper schreiben, der nach diesem Konzept funktionieren soll:
<?php $sql->select('*')->from('test')->where("'id' = 3 "); ?>
Nun habe ich die Klasse bisher wie folgt erstellt:
<?php class sql { private $mini_sql; //---------------------------------------------------------------- //------------ MINI SQL --> dont use!!! buggy //---------------------------------------------------------------- public function select($str=false) { $this->array_query['select'] = (!empty($str)) ? $str : '*'; } public function from($str=false) { $this->array_query['from'] = (!empty($str)) ? $str : ''; $this->mini_sql = true; return (object) 'foo'; } public function where($str= false) { $this->array_query['where'] = (!empty($str)) ? $str : ''; } public function order($str= false) { $this->array_query['order'] = (!empty($str)) ? $str : ''; } private function min_sql() { $this -> sLastQuery = "SELECT " . $this->array_query['select'] . " FROM " . $this->array_query['from']; $this -> sLastQuery .= (!empty($this->array_query['where']))? ' WHERE '.$this->array_query['where'] : ''; $this -> sLastQuery .= (!empty($this->array_query['order']))? ' ORDER BY '.$this->array_query['order'] : ''; $this -> obj = $this -> sDBLink -> prepare($this -> sLastQuery); } } ?>
Was den Fehler: "Fatal error: Call to a member function from() on a non-object" zurückgibt.
Bei der Suche im netz habe ich leider nur die Möglichkeit gefunden, jede dieser funktionen als eigene Klasse zu hinterlegen, was aber einfach zu unpraktisch ist.
Gibt es noch eine Möglichkeit um die oben beschriebene Klasse zum funktionieren zu kriegen, sodass der sql-query ordenlich erstellt wird?
würde mich über tipps freuen
Daniel
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich kenn momentan den Fachbegriff nicht, das geht aber nur, wenn du auf Klassen "als Attribute" zugreifst:
class Test { public $foo; function __construct() { $this->foo = new AndereKlasse(); } } class AndereKlasse { public function test() { // } }
Zugriff über
$instanz = new Test(); $instanz->foo->test();
/Edit: Vielleicht gehts aber auch anders
Beitrag zuletzt geändert: 21.6.2012 16:23:27 von trueweb -
Ich hab da mal eine andere schreibweise gesehen, probiers mal so:
$object->select() ->from() ->where();
Das hatte ich mal irgendwo gesehen, so ein "Supercall" oder so.
So wie du das gemacht hast möchte er die Rückgabewerte derefferenzieren, das willst du aber nicht. würde aber gehen, wenn jede Variable "return $this;" enthält. Also als beispiel:
public function select($str=false) { $this->array_query['select'] = (!empty($str)) ? $str : '*'; return $this; }
Deine Sache.
Liebe Grüße -
ggamee schrieb:
So wie du das gemacht hast möchte er die Rückgabewerte derefferenzieren, das willst du aber nicht. würde aber gehen, wenn jede Variable "return $this;" enthält. Also als beispiel:
public function select($str=false) { $this->array_query['select'] = (!empty($str)) ? $str : '*'; return $this; }
Deine Sache.
Liebe Grüße
Danke! Ist echt mal eine schöne Lösung und wird in Zukunft hoffentlich viel Schreibarbeit reduzieren
Werde die Klasse online stellen, sobald sie fertig ist, damit dann alle davon profitieren können :)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage