eigene Klassen: __toString() oder getHtml()?
Matze
- php
Hallo!
Ich habe wahrscheinlich gerade einfach nur ein Brett vor dem Kopf...
Ich habe mehrere Klassen deren Ausgaben ich puffern möchte um sie Ende gesammelt auszugeben. Alle diese Klassen geben HTML-Code zurück.
Als Beispiel nehmen wir dieses Forum hier wobei jeder thread einem Objekt entspricht.
Der HTML-Code der Objekte wird gesammelt und anschließend am Stück an der entsprechenden Stelle in der Seite ausgegeben.
Meine Frage lautet jetzt ob es sinnvoll wäre dafür die __toString()-Funktion zu benutzen oder besser eine "eigene" Funktion, z.B. getHtml() zu schreiben.
Also
class foo{
private strHtml;
/* do some magic */
function __toString(){
return $this->strHtml;
}
function getHtml(){
return $this->strHtml;
}
}
$foo = new foo();
echo $foo;
echo $foo->getHtml();
Würde ich mir damit etwas verbauen oder sollte ich sogar das native __toString() benutzen?
Wie ist eure Meinung?
Grüße, Matze
hi,
Ich habe wahrscheinlich gerade einfach nur ein Brett vor dem Kopf...
Ich habe mehrere Klassen deren Ausgaben ich puffern möchte um sie Ende gesammelt auszugeben. Alle diese Klassen geben HTML-Code zurück.
Das wäre ersteinmal zu klären:
[a] Macht die Klasse selbst eine Ausgabe (z.B. mit echo)?
[b] Hat die Klasse einen Rückgabewert, der mit include/require aufgefangen werden kann?
Hotti
Hallo!
Das wäre ersteinmal zu klären:
[a] Macht die Klasse selbst eine Ausgabe (z.B. mit echo)?
Nein. Fehler oder Ausgaben in Verbindung mit Abhängigkeiten werden abgefangen.
[b] Hat die Klasse einen Rückgabewert, der mit include/require aufgefangen werden kann?
Wenn ich sie nur include, ist sie noch nicht instanziert, kann also auch gar nichts zurück geben.
Grüße, Matze
hi,
Wenn ich sie nur include, ist sie noch nicht instanziert,
Logisch.
kann also auch gar nichts zurück geben.
Es hätte ja sein können, dass ein HTML-Template zurückgegeben wird.
Hotti
Es hätte ja sein können, dass ein HTML-Template zurückgegeben wird.
Du denkst in die falsche Richtung.
1. Eine Klasse kann per se nichts zurück geben.
2. Eine Datei ist keine Klasse.
Grüße, Matze
- Eine Klasse kann per se nichts zurück geben.
Das hast DU aber geschrieben:
Ich habe mehrere Klassen deren Ausgaben ich puffern möchte um sie Ende gesammelt auszugeben. Alle diese Klassen geben HTML-Code zurück.
Ja, was geben Deine Klassen denn wirklich zurück ;)
Hotti
Das hast DU aber geschrieben:
Ja, was geben Deine Klassen denn wirklich zurück ;)
Ungeschickt ausgedrückt, das gebe ich zu. Aber müßig das weiter auszudiskutieren wenn du sonst nichts zum Thema zu sagen hast. Ich schlage vor wir belassen es dabei, dass wir festhalten können, dass du meine Frage nicht beantworten kannst.
Grüße, Matze
Das hast DU aber geschrieben:
Ja, was geben Deine Klassen denn wirklich zurück ;)Ungeschickt ausgedrückt, das gebe ich zu. Aber müßig das weiter auszudiskutieren wenn du sonst nichts zum Thema zu sagen hast.
Zu meinem Hinweis, Stichwort 'Template': Mach nicht den Fehler, den andere in ihren Frameworks machen, dass im Template selbst Methoden derjenigen Klasse gebraucht werden, welche das Template einbindet. Das ist in PHP-Kreisen zwar verlockend, weil PHP selbst eine Templatesprache ist, aber in diesem Fall verbaust Du Dir von vornherein die Möglichkeit der Austauschbarkeit einer Template-Engine und beim Austausch von Templates ergeben sich unangenehme Abhängigkeiten.
Also weder __toString() noch getHTML(). Nimm für den Ausgabe-Puffer eine Eigenschaft der übergeordneten Klasse und überlege Dir eine zweckmäßige Datenstruktur für diesen Puffer, der unabhängig von der Tempateengine i.d.R. eine Referenz auf ein Array ist (Twig, Smarty).
Und jetzt versuche den Sinn eines return zu verstehen: Wenn die Klasse mit include/require eingebunden wird, kann sie genau an dieser Stelle ein Template zurückgeben, was manchmal sinnvoll ist. Danach erfolgt die Instanziierung, ggf. gefolgt vom Aufruf einiger Methoden und erst zum Schluss wird das Template gerendert.
Schönen Abend,
Hotti
Das hast DU aber geschrieben:
Ach habe ich übrigens nicht. Ich sprach von Ausgaben, nicht von Rückgaben. Aber sei es drum.
Grüße, Matze
Moin!
Meine Frage lautet jetzt ob es sinnvoll wäre dafür die __toString()-Funktion zu benutzen oder besser eine "eigene" Funktion, z.B. getHtml() zu schreiben.
Unabhängig davon, ob irgendwas anderes darauf Einfluss hat, denke ich natürlich sofort in Richtung des kontextgerechten Escapings.
Das heißt: Man will wissen, ob man es bei einem String (und die Stringrepräsentation einer Klasse ist dasselbe) mit HTML-Text oder Plain-Text zu tun hat. Keinesfalls will man in dieser Frage Unklarheiten und Mischformen.
Deshalb plädiere ich ganz klar für getHtml() - nichts kommuniziert so deutlich, dass die Rückgabe HTML enthält, welches dann hoffentlich korrekt escaped wurde, sofern nötig. Insbesondere kommuniziert es, dass man es seinerseits NICHT nochmal für HTML escapen darf, und dass es für andere Kontexte nicht unbehandelt geeignet sein könnte.
getHtml() lässt außerdem Platz für getPlaintext(), und die Methode __toString() kann ggf. zum Debugging verwendet werden, wenn man mal ein solches Objekt als Log-Text mit ausgeben muss. Ich würde __toString() nur zurückhaltend als nutzbringende Printfunktion einsetzen. Im Zweifel kann man alle Objekte, die getHtml() kennen, in ein Decorator-Objekt einkapseln, welches auf __toString() hin intern getHtml() zurückgibt.
- Sven Rautenberg
Hallo!
Klingt absolut logisch und nachvollziehbar!
Herzlichen Dank!
Grüße, Matze