ERLEDIGT
NEIN
NEIN
ANTWORTEN
14
14
ZUGRIFFE
418
418
EMPFEHLEN
-
08.05.09 18:47 #1
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
Hallo,
ich bin gerade wieder dabei mir eine Klasse zu basteln, welche man dann in etwa so aufrufen kann:
Das habe ich bisher so gelöst, dass diese Klasse auf einer untergeordneten Klasse arbeitet.Code PHP:1 2
$class = new Class(); $class->func_1()->func_2()->func_3() ... ->func_n();
Wo liegt mein Problem?
Mein Problem liegt darin, dass man nicht nur die Methoden so aufrufen soll ($a->func1()->func2()->func3()) sondern auch mal so ($a->func1()->func2()). Es gibt also Methoden, die man an andere noch extra anhängen kann, aber nicht muss. Die Schwierigkeit ist jetzt, dass ich einzelnen Daten intern zwischen speichere und dann in der letzten Methode in dieser Reihe ausführen will. Die Frage ist nur, ob es eine Möglichkeit gibt, dass man erkennt, ob eine Methode die Letzte in einer Reihe ist. Was auch gehen würde, wäre wenn man vor dem Aufrufen einer solchen Methoden-Reihe die Daten zurücksetzt - Frage ist nur wie.
Ich hoffe, ich konnte das verständlich erklären. Ansonsten noch mal nachfragen und schon jetzt Danke an alle, die mir helfen wollen/können.Geändert von einfach nur crack (08.05.09 um 19:07 Uhr)
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
08.05.09 20:00 #2
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.127
Hallo,
ich denke, hier hilft dir die magische Methode __call() weiter.Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
10.05.09 23:22 #3
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
So. Ich habe mir mal ein kleines Beispiel dafür programmiert, ähnlich dem Beispiel im PHP Handbuch.
Code PHP:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<?php class test { function test1() { echo 'Ich bin die Methode test1()'."\n"; } function test2() { echo 'Ich bin die Methode test2()'."\n"; } function __call($name, $args) { echo 'Methodenname: '.$name."\n"; } } $test = new test; $test->test1(); $test->test2(); ?>
Jetzt müsste mir ja ausgegeben werden..
..aber leider wird nur folgendes ausgegeben:Code :1 2 3 4
Ich bin die Methode test1() Methodenname: test1 Ich bin die Methode test2() Methodenname: test2
Code :1 2
Ich bin die Methode test1() Ich bin die Methode test2()
Ich benutzte die PHP Version 5.2.5 - liegt es jetzt daran, dass ich eine zu niedrige PHP Version habe oder das ich diese Methode falsch anwende? Eine Suche bei Google ergab keine eindeutige PHP Version ab welcher die Methode __call() verfügbar ist.
// EDIT: Ich habe jetzt mit Hilfe von dieser Seite erfahren, dass diese Methode dafür da ist, dass falls eine unbekannte Methode aufgerufen wird diese als Ersatz aufgerufen wird, somit ist mein Beispiel oben verständlicher Weise Blödsinn.Geändert von einfach nur crack (11.05.09 um 00:13 Uhr)
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
11.05.09 19:01 #4
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
An saftmeister: ich habe jetzt noch mal überlegt und bin jetzt soweit gekommen, dass ich überhaupt nicht verstehe auf welche Art und Weise mir die Methode __call() helfen soll. Könntest du mir deinen Gedankengang noch mal schildern? Wäre ganz nett.
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
11.05.09 21:56 #5
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.127
Hallo,
ich denke, ich habe deinen Ausgangspost falsch verstanden:
Ich bin davon ausgegangen, das du meintest, die Methoden müssen nicht unbedingt implementiert werden. Genau dann, wenn eine Methode in einer Klasse _nicht_ unbedingt definiert sein muss, kann man __call() verwenden. Da du es anscheinend anders gemeint hast, ist mein Vorschlag natürlich obsolet. __call() reagiert auf einen Methoden-Aufruf einer Klasse, die die aufgerufene Methode _nicht_ implementiert.Es gibt also Methoden, die man an andere noch extra anhängen kann, aber nicht muss.
Was du bräuchtest, wäre eine Art Objekt-Proxy. Ich habe sowas noch nicht gemacht, da ich es nicht benötigt habe. Vielleicht kannst du jedoch mit diesem Stichwort irgendwas finden.Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
11.05.09 22:06 #6
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
Danke, dass klingt schon viel versprechend. Melde mich wieder, wenn ich was gefunden habe (oder immer noch nicht weiter weiß).
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
Leider habe ich gerade nicht die Zeit mich selbst damit zu befassen, aber die Datenbank-Klasse von TYPOlight nutzt diese Art der Methodenaufrufe.
(Weiss ich auch nur, da ich ein Modul dafür entwickel.)
Kannst ja mal schauen wie das dort gemacht ist.
Würde mich nämlich auch interessieren, wie das abläuft.
mfg
DeluXe
-
11.05.09 23:35 #8
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
an DeluXe: Ich habe mir die Datenbank Klasse mal angesehen und muss sagen, dass das schon langsam in die Richtung geht, die ich suche. Aber eben noch nicht ganz. Ich zeige euch mal, wie das in TYPOlight gelöst wurde:
Code PHP:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
function __get($func) { switch($func) { case 'func1': return $this->func1(); break; case 'value': return $this->value; break; default: return $this; break; } }
Das hat aber als Nachteil, dass dann nur am Ende der Kette eine Funktion stehen kann. Die Frage wäre nun, wie man dass auch für Funktionen erreicht, also genauer gesagt, wie man eine geregelte Verkettung erstellen kann.Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
Entweder verstehe ich dich falsch oder du liegst falsch.

Weil in TL kann man z. B. mit diesem Befehl eine Query ausführen:
Und das sind ja zwei Funktionen hintereinander, nicht nur eine am Ende.PHP-Code:$db->prepare( 'SELECT * FROM foo WHERE bar = %d' )->execute( $int );
mfg
DeluXe
-
12.05.09 12:10 #10
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
Mh, dass stimmt natürlich. Ich habe jedenfalls gestern Abend nur die obenstehende Lösung gefunden. Dann werde ich wohl weitersuchen müssen. Du könntest mir aber helfen in dem du mir sagst auf welche PHP-Datei du dich beziehst, da es in TYPOlight mehrere Datenbank-Klassen gibt.
// EDIT: Ich habe es jetzt nicht gefunden, aber dafür habe ich jetzt noch mal selber intensiv nachgedacht und bin zu folgender Lösung gekommen, welche auch funktioniert und die von saftmeister genannte Funktion __call() verwendet:
Die Idee die dahinter steckt ist die, dass man so nur bestimmte Funktionen, welche als private gekennzeichnet werden, aufrufen kann. Um sie zu kennzeichnen habe ich hier einfach die Markierung sub_ verwendet. Man kann also jetzt in der Funktion __call() auch noch nachschauen, ob diese Funktion an dieser Stelle überhaupt gültig ist und man sie so aufrufen darf. Ansonsten wird eben NULL ausgegeben und damit es ein wenig wie echt wirkt auch noch die Standard-Fehlermeldung mit trigger_error().Code PHP:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
function __call($name, $args) { switch($name) { case 'func2': return $this->sub_func2($args); case 'func3': return $this->sub_func3($args); case 'func4': return $this->sub_func4($args); default: trigger_error('Call to undefined method '.__CLASS__.'::'.$name.'()', E_USER_ERROR); return NULL; } }
Würde mal gerne wissen, was ihr von der Idee haltet. Verbesserungsvorschläge sind erwünscht!Geändert von einfach nur crack (12.05.09 um 15:18 Uhr) Grund: Möglicher Lösungsansatz gefunden
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
12.05.09 20:58 #11
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.127
Hallo,
du kannst dir den switch sparen, wenn du die Methode method_exists() verwendest:
Ohne Garantie, das da Fehler drin ist; hab das auf dem Kopf gemachtPHP-Code:public function __call($func, $args)
{
if(method_exists($this, $func))
{
return call_user_func(array($this, $func));
}
else
{
throw new Exception("Method $func does not exists!");
}
}
. Funktionieren dürfte es allerdings so oder so ähnlich.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
12.05.09 21:04 #12
- Registriert seit
- May 2007
- Ort
- Dresden (Sachsen)
- Beiträge
- 1.499
Der Gedanke hinter der SWITCH-Anweisung war, dass man für jede Methode, welche aufgerufen wird, speziell Ausführungen schreiben kann.
Ich mag:- positive Bewertungen meiner Beiträge
- ein Danke für meine hilfreichen Beiträge
Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX
... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.
-
Um nochmal auf TYPOlight zurück zu kommen.
(Ich hoffe ich bekomm alles noch aus dem Kopf richtig zusammen.
)
Es gibt einen Ordner system/libraries, in welchem eine Database.php liegt. Diese enthält ein paar abstrakte Klassen.
Je nach dem, welche Datenbank man verwendet, wird dann aus dem Ordner system/Drivers die Datei DB_MYSQL.php, DB_MSSQL.php, etc. geladen.
Das sollte eigentlich schon alles sein, zumindest kann ich mich an keine weiteren Klassen erinnern, die mit der Datenbank-Klasse in Zusammenhang gestanden haben könnten.
Allerdings habe ich absolut nichts darüber gefunden, wodurch diese Function-Chain (Keine Ahnung wie das wirklich heisst.) ermöglicht wird, da auch so gut wie keine magische Funktionen verwendet werden.
*edit*
Achso, um auf deinen letzten Post einzugehen.
Ich persönlich finde die Idee mit dem Switch vollkommen am eigentlichen Thema vorbei.
Ob ich $foo->bar() aufrufe und dann in einem Switch lande und dieser komisches Zeug macht, oder ob ich tatsächlich die Methode bar() definiere, die im Endeffekt genau das selbe macht wie der Switch, macht in meinen Augen keinerlei unterschied - ausser das letztere Variante übersichtlicher ist.
Geändert von DeluXe (23.05.09 um 14:47 Uhr)
mfg
DeluXe
-
Bzgl. deines ersten Postings in diesem Thread. Das gewünsche Verhalten lässt sich da ganz einfach mit Fluent Interfaces umsetzten. Infos diesbzgl. findest du hier:
http://en.wikipedia.org/wiki/Fluent_interface
mit freundlichen Grüßen
Samuel Weber
-
Ein return $this; ist alles?

Das ist ja langweilig..
Danke Dir für die Info.mfg
DeluXe
Ähnliche Themen
-
Dateien automatisch löschen
Von bl5000 im Forum PHPAntworten: 21Letzter Beitrag: 12.11.10, 18:20 -
Automatisch löschen mit PS 3?
Von Alex363 im Forum PhotoshopAntworten: 4Letzter Beitrag: 17.02.09, 15:55 -
Automatisch löschen
Von PsychoGiga im Forum PHPAntworten: 20Letzter Beitrag: 02.11.04, 22:24 -
Datensatz automatisch löschen
Von andyK im Forum PHPAntworten: 13Letzter Beitrag: 27.08.04, 20:41 -
session automatisch löschen
Von oaki im Forum PHPAntworten: 4Letzter Beitrag: 23.07.04, 16:31






Zitieren
Login






[PHP] [Codeschnipsel] ImageColor aus HTML-Farbcodierung erstellen