Andreas Korthaus: OOP - Methode nur einmal ausführen

Hallo!

Wenn ich eien Methode habe, die ich nur bei dessen Aufruf brauche, wie kann ich es schaffen das diese nur einmal ausgeführt wird, und auch nicht beim Starten automatisch?

Habe folgendes, ich habe User-Daten wie Name, username, password, Adresse, email..., die ich mit alle aus der Datenbank hole. Das ganze habe ich in meine Basisklasse integriert, die in jedem Script instaziert wird.
Jetzt brauche ich die User-Daten auch nur in jedem 4. Script, daher wäre es etwas viel overhead jedesmal diese Datenbankabfrage zu machen.

Kann ich innerhalb einer Methode prüfen, ob die Daten in der Klasse bereits zur Verfügung stehen, und nur wenn nicht die Abfrage abzuschicken?

Oder lohnt es sich sogar die Userdaten in eine eigene Klasse zu packen?

Grüße
Andreas

  1. Halihallo Andreas

    Kann ich innerhalb einer Methode prüfen, ob die Daten in der Klasse bereits zur Verfügung stehen, und nur wenn nicht die Abfrage abzuschicken?

    Was spricht gegen die Lösung, ein privates Klassen-Attribut zu setzen, welches true ist,
    wenn die Daten geladen sind bzw. false, wenn nicht? - In der Methode kannst du auf dieses
    Attribut testen und ggf. die Daten einlesen. Bei mehreren Kunden ist dieses Attribut eben
    ein assoziatives Array.

    Oder lohnt es sich sogar die Userdaten in eine eigene Klasse zu packen?

    Wenn du mehrere Methoden hast, die für Kundendaten spezialisiert sind und der Einfachheit
    halber keine Indizies angeben möchtest (also welcher Kunde nun geänder werden soll),
    halte ich das für eine gute Lösung, ja.

    Viele Grüsse

    Philipp

    1. Hallo Philipp!

      Das ging jetzt aber fix ;-)

      Was spricht gegen die Lösung, ein privates Klassen-Attribut zu setzen, welches true ist,
      wenn die Daten geladen sind bzw. false, wenn nicht? - In der Methode kannst du auf dieses
      Attribut testen und ggf. die Daten einlesen. Bei mehreren Kunden ist dieses Attribut eben
      ein assoziatives Array.

      OK, wäre eine Möglichkeit. Oder könnte man nicht einfach beim Aufrufen  methode sowas machen:

      class Basic {
          var $userid;

      getUSerData($val) {
              if ($this->userid) {
                  return $this->$val;
              }
              else {
                  $db-query("SELECT...");
                  $this->userid = $row->userid;
                  ...
                  return $this->$val;
              }
          }
      }

      ???

      Wenn du mehrere Methoden hast, die für Kundendaten spezialisiert sind und der Einfachheit
      halber keine Indizies angeben möchtest (also welcher Kunde nun geänder werden soll),
      halte ich das für eine gute Lösung, ja.

      es geht um die DAten des eingeloggten Users, zum einen für Authentifizierung, aber auch email-Adresse für mails etc. Ich muß mit den Daten nichts machen außer sie den Scripten bereitszustellen, da dachte ich halt an eine Funktion wie oben beschreiben. Hierfür lohnt sich wohl keine eigene Klasse.

      Außerdem habe ich bisher dazu tendiert immer eigene Klassen udn je eien Datei zu bilden, und die dann alle konditional mit include einzubinden, da habe ich aber oft 10 Dateien und mehr, ist vielleicht nicht immer der performanteste Weg, oder?

      Grüße
      Andreas

      1. Halihallo Andreas

        Das ging jetzt aber fix ;-)

        Bin zur richtigen Zeit am richtigen Ort gewesen ;-)

        Was spricht gegen die Lösung, ein privates Klassen-Attribut zu setzen, welches true ist,
        wenn die Daten geladen sind bzw. false, wenn nicht? - In der Methode kannst du auf dieses
        Attribut testen und ggf. die Daten einlesen. Bei mehreren Kunden ist dieses Attribut eben
        ein assoziatives Array.
        OK, wäre eine Möglichkeit. Oder könnte man nicht einfach beim Aufrufen  methode sowas machen:

        Das ist etwa Deckungsgleich mit meiner Aussage. Nur, dass du dann in der Klasse Basic
        nur einen einzigen Kunden im "Cache" haben kannst. Wenn du über Basic eine Schnittstelle
        zu mehreren Kunden haben möchtest, musst du die Daten und das Flag ob gelesen oder nicht,
        in einem assoziativen Array speichern, sodass du alle Kundendaten cachen kannst (wenn du
        einen Kunden einliest, dann einen zweiten und dann die Daten des ersten Kunden einlesen
        möchtest, wird notgedrungen wieder die DB kontaktet). Es sei denn, du hast eben eine
        Instanz pro Kunde (was ich aus deiner Beschreibung nicht herausgelesen habe), dann reicht
        natürlich ein einwertiges Flag.

        Wenn du mehrere Methoden hast, die für Kundendaten spezialisiert sind und der Einfachheit
        halber keine Indizies angeben möchtest (also welcher Kunde nun geänder werden soll),
        halte ich das für eine gute Lösung, ja.
        es geht um die DAten des eingeloggten Users, zum einen für Authentifizierung, aber auch email-Adresse für mails etc. Ich muß mit den Daten nichts machen außer sie den Scripten bereitszustellen, da dachte ich halt an eine Funktion wie oben beschreiben. Hierfür lohnt sich wohl keine eigene Klasse.

        Außerdem habe ich bisher dazu tendiert immer eigene Klassen udn je eien Datei zu bilden, und die dann alle konditional mit include einzubinden, da habe ich aber oft 10 Dateien und mehr, ist vielleicht nicht immer der performanteste Weg, oder?

        Nun, ich löse dies genau gleich. Jedes "reale" Objekt wird in einer Klasse abgebildet,
        welche nur geladen wird, wenn auf das entsprechende Objekt zugegriffen wird. Natürlich,
        man hat dann mehrere Dateien; diese separat einzulesen braucht Performance. Es gibt einen
        anderen Ansatz, der Package-Ansatz, alle Klassen, die logisch zum selben Thema gehören,
        werden in eine Datei (dem Package) gepackt und alle sammt auf einmal eingelesen, somit
        beschränkt sich das auf eine Datei lesen, was weniger Performance braucht, jedoch ist die
        Datei grösser (und bei grösseren Projekten ist das dann auch wieder ungut, da der Parser
        dann eine riesen Datei parsen muss, ob die Methoden/Klassen nun gebraucht werden oder
        nicht). Ich glaube jedoch, dass das Stichwort Performance hierbei eher nebensächlich ist,
        da es erstmal auf die Umsetzung darauf ankommt, ob eine Software performant ist.

        Viele Grüsse

        Philipp

        PS2all: [pref:t=34949&m=190860] würde mich freuen.