oop in php
saka
- php
hallo zusammen,
bin gerade dabei meine seite neu aufzubauen, allerdings in php mittels oop, ist nämlich eine sehr feine sache.
nun zu mein problem.
ich sende eine mysql_query an meine datenbank. die ankommenden daten speichere ich ein eine varibale bzw. in ein array. die array und die variable ist jan in der public function, die den query enthält.
wenn ich nun die public function aufrufe und auf den array bzw. auf die variablen zugreifen möchte (ausgeben) geht es nicht.
es geht aber allerdings, wenn ich in der publich funktion globals $variable, $array
schreibe.
dieser stil kommt mir ziemlich komisch vor. hat eine/r eine bessere idee???
viele grüße
saka
Hi!
dieser stil kommt mir ziemlich komisch vor.
Mir auch.
hat eine/r eine bessere idee???
Versuche es mit einer genauen Fehlerbeschreibung und etwas relevantem Quellcode - ansonsten bleibt nur Raten übrig und das hilft Dir nicht.
Dein Problem hat - soweit ich es erahnen kann - weniger mit OOP, als vielmehr mit unterschiedlichen Scopes zu tun.
off:PP
hi,
hier mein php geschnipseltes:
public function show_site ($arg1, $arg2, $arg3, $arg4, $arg5) {
$query = mysql_query("SELECT `$arg2`, `$arg3`, `$arg4` FROM `$arg1` WHERE `$arg2` = '$arg5'");
global $site, $headline, $content;
if ($query == true) {
while ($row = mysql_fetch_object($query)) {
$site = search_and_replace($row->$arg2);
$headline = search_and_replace($row->$arg3);
$content = search_and_replace($row->$arg4);
}
} else { show_text('red', 'Fehler beim einlesen.'); }
}
ich habe dieses beispiel kurz gehalten. aber ich möchte später lieber alles in ein array packen, weil die query's dann nicht nur drei daten ausgeben.
lg
saka
Hi!
public function show_site ($arg1, $arg2, $arg3, $arg4, $arg5) {
$query = mysql_query("SELECT$arg2
,$arg3
,$arg4
FROM$arg1
WHERE$arg2
= '$arg5'");
Auch bei OOP-Programmierung ist eine Nichtbeachtung des Kontextwechsels ein Programmierfehler.
global $site, $headline, $content;
Warum verwendest du keine Objektvariablen sondern "normale"?
if ($query == true) {
Einen Ausdruck extra auf true zu testen ist unsinnig. Wenn er wahr ist, dann ist er das bereits. Er wird nicht wahrer, wenn man ihn noch einmal mit true vergleicht.
} else { show_text('red', 'Fehler beim einlesen.'); }
Aufgabe eines Daten abfragenden Teils ist es nicht, Fehlermeldungen auszugeben. Wenn ein Fehlerzustand eingetreten ist, muss man den Aufrufer informieren, aber nicht selbständig einfach einen Text in der Landschaft ablegen. Um Fehler an den Aufrufer zu melden, kann man Exceptions verwenden.
ich habe dieses beispiel kurz gehalten. aber ich möchte später lieber alles in ein array packen, weil die query's dann nicht nur drei daten ausgeben.
Gerade dann sollte man nicht extra ein Array aufbauen, dass in den meisten Fällen genau einmal ausgelesen wird. Besser ist es, einen Iterator zu implementieren, der erst bei dessen Aufruf das Fetchen erledigt (Das Iterator-Interface gibt es in der SPL).
Lo!
Hi!
Dein Problem hat - soweit ich es erahnen kann - weniger mit OOP, als vielmehr mit unterschiedlichen Scopes zu tun.
Das ist eher nicht einer ordentlichen Lösung dienlich. Wenn global die Lösung wäre, dann wäre die OOP falsch angewendet, weil das Array dann eine einfache Variable und keine Eigenschaft des Objekts wäre.
Lo!
Hi!
Dein Problem hat - soweit ich es erahnen kann - weniger mit OOP, als vielmehr mit unterschiedlichen Scopes zu tun.
Das ist eher nicht einer ordentlichen Lösung dienlich. Wenn global die Lösung wäre,
Wo schrieb ich denn, dass global die Lösung sei? Ich wollte zunächst etwas Quellcode sehen, den ich mir nun anschaue.
off:PP
Hi!
Dein Problem hat - soweit ich es erahnen kann - weniger mit OOP, als vielmehr mit unterschiedlichen Scopes zu tun.
Das ist eher nicht einer ordentlichen Lösung dienlich. Wenn global die Lösung wäre,
Wo schrieb ich denn, dass global die Lösung sei? Ich wollte zunächst etwas Quellcode sehen, den ich mir nun anschaue.
Scope-Probleme kann man nur mit global oder $GLOBALS lösen. Ansonsten muss man die problematische Stelle so umschreiben, dass der Scope keine Rolle mehr spielt. Insofern sehe ich einen Verweis auf den Scope in die Richtung global gehend an. Nicht der Scope ist das Problem, sondern unzureichende OOP-Kenntnisse (was ich auch schon erahnte, bevor ich das Codebeispiel sah).
Lo!
Hi!
Scope-Probleme kann man nur mit global oder $GLOBALS lösen. Ansonsten muss man die problematische Stelle so umschreiben, dass der Scope keine Rolle mehr spielt.
Einverstanden.
Insofern sehe ich einen Verweis auf den Scope in die Richtung global gehend an.
Es war der Hinweis auf die anscheinend nicht verstandene Tatsache, *was* global bewirkt, keine Empfehlung globale Variablen zu benutzen.
Nicht der Scope ist das Problem, sondern unzureichende OOP-Kenntnisse (was ich auch schon erahnte, bevor ich das Codebeispiel sah).
Ahnen ja, wissen nein. Eine Antwort an OP hast Du ja bereits geschrieben.
off:PP
Hi!
Nicht der Scope ist das Problem, sondern unzureichende OOP-Kenntnisse (was ich auch schon erahnte, bevor ich das Codebeispiel sah).
Ahnen ja, wissen nein. Eine Antwort an OP hast Du ja bereits geschrieben.
Es ist ja eigentlich logisch. Wer mit global hantiert, um ein Problem zu lösen, kann nicht $this->... verwendet haben. (Und $this ist essentieller Bestandteil von (PHP-)OOP.)
Lo!
huhu,
so, habe es jetzt hinbekommen, ohne eure hilfe :-). achso, nochwas:
Nicht der Scope ist das Problem, sondern unzureichende OOP-Kenntnisse (was ich auch schon erahnte, bevor ich das Codebeispiel sah).
sowas könnt ihr euch sparen. ein forum ist da um zu helfen und nicht sein eigenes klugscheißerei kund zugebeben. dafür habe ich eine toilette. ihr anscheinend nicht.
viele grüße
saka
Hello,
ich sende eine mysql_query an meine datenbank.
Wie machst Du das?
die ankommenden daten speichere ich ein eine varibale bzw. in ein array.
Glaube ich nicht, weil Du ja OOP benutzt. Dann speichert deine Methode die Daten bestenfalls in einem (Unter-)Objekt oder einer Eigenschaft des (Haupt-)Objektes, dem auch die methoden gehören.
die array und die variable ist jan in der public function, die den query enthält.
Das Ergebnis sollte nun im (Haupt-)Objekt eingebettet liegen. Vermutlich wirst Du ein Objekt dafür benutzt haben, das eine Collection (List, Set, o.ä) enthält.
wenn ich nun die public function aufrufe und auf den array bzw. auf die variablen zugreifen möchte (ausgeben) geht es nicht.
Dann benutze doch eine Methode für den Zugriff. Du findest doch, OOP sei eine feine Sache. Dann mach es auch richtig.
Und schau Dir vor allem erstmal die vorhandenen Methoden des Datenbankobjektes an, bevor Du eigene erfindest.
http://de.php.net/manual/de/mysqli.query.php
http://de.php.net/manual/de/class.mysqli.php
Ist mMn ein bisschen wuselig, aber deshalb muss man trotzdem nicht daran vorbei programmieren.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
die ankommenden daten speichere ich ein eine varibale bzw. in ein array.
Glaube ich nicht, weil Du ja OOP benutzt.
Sieh an, und "weil er OOP benutzt" gibt es keine Arrays?
Dann speichert deine Methode die Daten bestenfalls in einem (Unter-)Objekt
Unterobjekt??
oder einer Eigenschaft des (Haupt-)Objektes, dem auch die methoden gehören.
Zu einer "Eigenschaft" koennen unter PHP keine Methoden gehoeren*.
Das Ergebnis sollte nun im (Haupt-)Objekt eingebettet liegen.
"In einem Hauptobjekt eingebettet sein" ?? Herrje.. die rede ist wohl von einem Result Set Object.
Vermutlich wirst Du ein Objekt dafür benutzt haben, das eine Collection (List, Set, o.ä) enthält.
Aua. List, Sets unter PHP? Also ein Array.
Du findest doch, OOP sei eine feine Sache. Dann mach es auch richtig.
Mit deinen Anweisungen geht das ganz stark in die Hose!
Mir ist echt schleierhaft wer ein so technisch falsches Posting mit "fachlich hilfreich" bewertet. Aber ich denke da kannst du wohl mehr zu sagen.
Kristoff
* Auszer es handelt sich wiederum um ein Objekt, aber dies hast Du mit deiner vorherigen Aussage des Satzes ja bereits ausgeschlossen.
Hi!
Dann speichert deine Methode die Daten bestenfalls in einem (Unter-)Objekt
Unterobjekt??
Das soll man wohl so verstehen, dass dieses Objekt die Aufgabe hat, die Ergebnismenge zu repräsentieren. Das ist von der Aufgabenstellung "Datenabfrage" eine Unteraufgabe, wenn man so will. Man kann es auch so lesen, dass dieses Objekt von einer Eigenschaft des Datenabfrage-Objekts aus referenziert wird. Hauptsächlich arbeitet man mit diesem Objekt und auf die Ergebnismenge greift man über eine seiner Eigenschaften zu. Das Ergebnismengenobjekt sitzt also quasi unter den Fittichen des Datenabfrageobjekts.
oder einer Eigenschaft des (Haupt-)Objektes, dem auch die methoden gehören.
Zu einer "Eigenschaft" koennen unter PHP keine Methoden gehoeren*.
* Auszer es handelt sich wiederum um ein Objekt, aber dies hast Du mit deiner vorherigen Aussage des Satzes ja bereits ausgeschlossen.
Das "dem auch die methoden gehören" bezieht sich nach meiner Lesart auf "des (Haupt-)Objektes", nicht auf die Eigenschaft.
Das Ergebnis sollte nun im (Haupt-)Objekt eingebettet liegen.
"In einem Hauptobjekt eingebettet sein" ?? Herrje.. die rede ist wohl von einem Result Set Object.
Er meint, dass die Ergebnismenge in irgendeiner Weise mit dem Objekt verbunden ist, beispielsweise dass eine Eigenschaft ein Array mit den Daten ist. Oder dass diese Eingeschaft ein weiteres Objekt referenziert, das die Ergebnismenge in irgendeiner Weise beinhaltet.
Vermutlich wirst Du ein Objekt dafür benutzt haben, das eine Collection (List, Set, o.ä) enthält.
Aua. List, Sets unter PHP? Also ein Array.
Die einfachste Methode unter PHP ist natürlich ein Array, das ist flexibel genug, um für Aufgabenstellungen, für die man in anderen Sprachen eine Collection und ähnliche spezialisierte Strukturen wählt, geeignet zu sein. Nichtsdestotrotz kann man natürlich auch in PHP diese Dinge auf (aus PHP-Sicht) umständliche Weise nachbilden.
Lo!
Hello Kristoff,
Deine Bedenken kann ich überhaupt nicht teilen!
Ich will es Dir daher gerne nochmal erklären.
die ankommenden daten speichere ich ein eine varibale bzw. in ein array.
Glaube ich nicht, weil Du ja OOP benutzt.
Sieh an, und "weil er OOP benutzt" gibt es keine Arrays?Dann speichert deine Methode die Daten bestenfalls in einem (Unter-)Objekt
Unterobjekt??
Das Resultset als Objekt ist Unterobjekt zum Datenbankobjekt des OP.
oder einer Eigenschaft des (Haupt-)Objektes, dem auch die methoden gehören.
Zu einer "Eigenschaft" koennen unter PHP keine Methoden gehoeren*.
Grammatik! Dem Hauptobjekt (Instanz der Datenbankklasse) gehören die Eigenschaften und demselben Hauptiobjekt gehören auch die Methoden, mit denen die Eigenschaften behandelt werden können.
Sonst hätte ich geschrieben: "...denen auch die Methoden gehören".
Das Ergebnis sollte nun im (Haupt-)Objekt eingebettet liegen.
"In einem Hauptobjekt eingebettet sein" ?? Herrje.. die rede ist wohl von einem Result Set Object.
Das Objekt (als Instanz der Resultsetklasse) ist Property der Instanz der Datenbankklasse und damit in diese eingebettet.
Vermutlich wirst Du ein Objekt dafür benutzt haben, das eine Collection (List, Set, o.ä) enthält.
Aua. List, Sets unter PHP? Also ein Array.
Kannst Dir doch eine schreiben. Muss ja nicht immer alles fertig geliefert werden. Je nach verhalten der zu schreibenden Klasse wird es dann eine Liste, ein Set, ein Baum, oder was dein Herz begehrt. Aber du hast ja keins :-P
Du findest doch, OOP sei eine feine Sache. Dann mach es auch richtig.
Mit deinen Anweisungen geht das ganz stark in die Hose!
Wenn man lesen kann, führt das durchaus zum Ziel.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Kristoff.
oder einer Eigenschaft des (Haupt-)Objektes, dem auch die methoden gehören.
Zu einer "Eigenschaft" koennen unter PHP keine Methoden gehoeren*.
Nein, aber zu einem Genitiv-Attribut kann im Deutschen ein Relativsatz gehoeren.
Das Ergebnis sollte nun im (Haupt-)Objekt eingebettet liegen.
"In einem Hauptobjekt eingebettet sein" ?? Herrje.. die rede ist wohl von einem Result Set Object.
Wohl gerade nicht; der OP speichert das Ergebnis in einem Array, wie er schrieb. Und es ist ggf. ratsam, das nicht zu tun, sondern, wenn das Ergebnis iterierbar sein soll, eine Iteration ueber ein Ergebnis-Objekt zu implementieren. Ein Standard-Result-Set-Objekt liefert das nicht.
Vermutlich wirst Du ein Objekt dafür benutzt haben, das eine Collection (List, Set, o.ä) enthält.
Aua. List, Sets unter PHP? Also ein Array.
Verkettete Listen sind in der SPL implementiert.
Hast Du schlechte Laune?
Viele Gruesse,
der Bademeister