OOP, Frage zu return

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Ok, ich versuche das Ganze jetzt mal zu verstehen.

    Meine DB Klasse benutze ich so:

    $DBConnection->query("INSERT blah in blah")

    Nun verstehe ich das also so, dass ich in meiner Uploadklasse keine neue DB Verbindung aufbauen soll, also kein:

    function connect(){ }
    function select_db(){}

    etc, sondern das vorhandene in meiner Upload Klasse nutzen.

    Sprich der SQL Code:

    $DBConnection->query("INSERT blah in blah")

    soll in die ImageUpload Klasse, richtig? Oder bin ich damit zu unflexible?

    Die Klasse soll am Ende wirklich für die verschiedensten Seiten funktionieren. Einfach nur einbinden und wo man es braucht kurz

    $photouploads->imageUpload($ImageFile)

    fertig.

    Wie gesagt, jetzt fehlt mir einfach der Ansatz, wie und wo ich es in die Datenbank schreibe.

    Danke Euch für die Antworten.

    Gruß Luka

    Kommentar


    • #17
      Du musst deine Datenbank klasse mit einem http://en.wikipedia.org/wiki/Singleton_pattern ausstatten. Du besorgst dir dann in deiner Image Klasse im Konstruktor über $this -> db = Database :: getInstance ( ); eine Instanz und benutzt die dann für deine Abfragen. Die Bilder würde ich übrigens immer noch ins Dateisystem schreiben.
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #18
        Ok, jetzt muss ich das erstmal in google finden. Bisher steht da immer was von PHP 5, geht aber auch in 4 oder nicht? Klassen sind schon ziemlich kompliziert, vor allem wenn man zum ersten Mal eine Klasse entwirft. Ohne Eure Tips würde ich ziemlich alt aussehen. Vielen Dank dafür.


        Die Bilder würde ich übrigens immer noch ins Dateisystem schreiben
        Ich kopiere die Bilder in einen Bilderordner und schreibe nur die Daten in die Datenbank, das ist doch richtig so oder was meinst Du genau?

        Luka

        Kommentar


        • #19
          Ok, jetzt muss ich das erstmal in google finden.
          OffTopic:
          Warum das? Hatte ich dir nicht einen konkreten Link mit (!) Beispielcode gepostet?
          Ich kopiere die Bilder in einen Bilderordner und schreibe nur die Daten in die Datenbank, das ist doch richtig so oder was meinst Du genau?
          Ist schon richtig. Zwischendurch klang es nur mal so als ob du die Bilder in die Datenbank kopieren wolltest.
          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

          Kommentar


          • #20
            Jo, den link habe ich auch bereits durchgelesen, aber der Beispielcodse ist für PHP 5 und ich kann nur 4 benutzen.

            Außerdem muss ich eingestehen, dass ich immer gerne mehrere Beispiele lesen muss, bevor ich es verstehe, gerade wenn es meine erste Klasse ist.

            Von der Therorie ok, aber umsetzen in die Praxis ist das Problem.

            1. Ok, also DB Klasse mit Singleton pattern ausstatten.
            2. Instanz der Klasse in Image Upload erzeugen und für die Abfragen benutzen
            3. SQL Abfrage in Image Upload Klasse einbauen.

            Mal schauen was daraus wird....

            Kommentar


            • #21
              Mit ein bisschen Workaround gehts auch mit PHP 4 ...

              http://www.sitepoint.com/forums/showthread.php?t=265748
              http://www.techsanctuary.com/node/5
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #22
                Ok, versuche das jetzt mal umzusetzen und gebe dann feedback. Können bestimmt auch noch andere gebrauchen. Erstmal vielen,vielen Dank.

                Kommentar


                • #23
                  Ok, jetzt habe ich mich durch unendliche Seiten im www gelesen und komme dennoch mit meinem Singleton Pattern für PHP4 nicht weiter.

                  Ich fasse mal zusammen. In meiner DB Klasse gibt es jetzt folgendes:
                  PHP-Code:
                  $DBConnection = new mysqlconnection(); 

                  class 
                  mysqlconnection


                  function 
                  mysqlconnection($DBConnection)
                      {
                          
                  // weise der variable des aktuellen objekts den übergebenen wert zu.
                          
                  $this->mysqlconnection $DBConnection;
                      }

                      
                  function 
                  getinstance()
                      {
                          
                  // statische variable wird deklariert
                          
                  static $instance;
                          
                          
                  // wenn $instance kein obj ist, erstelle obj
                          
                  if (!is_object($instance)) {
                              
                  $instance = new mysqlconnection();
                          }
                          
                  // referenz
                          
                  return $instance;
                      }

                  PHP-Code:
                  Dann möchte ich $instance in meiner Image Upload Klasse nutzen.

                   
                  // objekt der klasse db als referenz in dieses objekt holen.
                          
                  $instance =& mysqlconnection::getinstance();

                  // danach irgendwie die DB Connection nutzen um Werte in DB einzutragen 

                  Wie gesagt, das Ganze soll mit PHP4 funktionieren. Ich komme einfach nicht weiter, wie man das umsetzt. Theorie ist klar, aber das in der Praxis?

                  Klappt einfach nicht. Vielleicht hat noch jemand einen Tip. Vielen, vielen Dank im Voraus.

                  Gruß Luka

                  Kommentar


                  • #24
                    probier immer zuerst mit einfachen dingen rum, bevor du debugging mit komplexen sachen betreibst.

                    PHP-Code:

                    class foo {
                      var 
                    $a 42;
                    }

                    function 
                    getInstance1() {
                      static 
                    $s null;
                      if (
                    is_null($s)) $s = new foo();
                      return 
                    $s;
                    }

                    function &
                    getInstance2() {
                      static 
                    $s null;
                      if (
                    is_null($s)) $s = new foo();
                      return 
                    $s;
                    }

                    $a getInstance1();
                    $a -> 2;
                    $b getInstance1();
                    var_dump($b);


                    $c = &getInstance1();
                    $c -> 3;
                    $d = &getInstance1();
                    var_dump($d);

                    $e getInstance2();
                    $e -> 4;
                    $f getInstance2();
                    var_dump($f);

                    $g = &getInstance2();
                    $g -> 5;
                    $h = &getInstance2();
                    var_dump($h); 
                    ansonsten finger weg vom singleton. das oop-mäntelchen um globale variablen herum braucht kein mensch. nimm lieber, verdammt nochmal, "global", das funktioniert wenigstens.

                    Kommentar


                    • #25
                      Original geschrieben von axo
                      ansonsten finger weg vom singleton. das oop-mäntelchen um globale variablen herum braucht kein mensch. nimm lieber, verdammt nochmal, "global", das funktioniert wenigstens.
                      Etwas limitierte Sichtweise ...

                      Um beim Beispiel Datenbankverbindungsklasse zu bleiben:

                      $DBConnection = DBConnection::init();
                      liefert mir immer und überall eine Verbindung zur DB - wenn schon eine bestand, wird diese weiterverwendet, sonst eine erstellt.

                      Wie machst du das mit $GLOBALS['DBConnection'] ...?

                      Da müsstest du vor jeder Verwendung erst mal prüfen,
                      if(!isset($GLOBALS['DBConnection'])) { // Verbindungsaufbau }

                      Wozu dieser Aufwand, wenn ich das schon "build-in" bekommen kann?
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #26
                        Original geschrieben von wahsaga
                        Etwas limitierte Sichtweise ...
                        sehe ich nicht ganz so, allerdings ist es relativ langweilig, jedes mal romane dazu zu schreiben, wenn es bereits genug futter zum thema unter google gibt.



                        Um beim Beispiel Datenbankverbindungsklasse zu bleiben:
                        $DBConnection = DBConnection::init();
                        liefert mir immer und überall eine Verbindung zur DB - wenn schon eine bestand, wird diese weiterverwendet, sonst eine erstellt.
                        wenn du das so schreibst, liefert dir das unter php4 immer und überall ein neues DBConnection-objekt (oder was auch immer init() zurückgibt).

                        Wie machst du das mit $GLOBALS['DBConnection'] ...?

                        Da müsstest du vor jeder Verwendung erst mal prüfen,
                        if(!isset($GLOBALS['DBConnection'])) { // Verbindungsaufbau }
                        nö, die verbindung wird im bootstrap aufgebaut, sobald die konfigurationsdatei da ist - denn "lazy loading" der datenbank-verbindung macht eh meist keinen besonderen sinn. und sollte die globale variable mal leer sein, hat man halt einen fehler in der ausführungsreihenfolge gemacht und kann das ganze innerhalb von minuten beheben.

                        Wozu dieser Aufwand, wenn ich das schon "build-in" bekommen kann?
                        mein reden!

                        ich möchte nochmal klarstellen: ich bin gegen globale variablen und halte diese für ein großes übel in der software-entwicklung. ich bin auch durchaus dazu fähig, objektkomposition zu betreiben und ein objekt an andere weiterzugeben, daher benötige ich globale variablen nie. ein singleton ist, gerade wie es hier verwendet wird, nur ein wrapper um eine globale variable und versteckt die tatsache, dass der entwickler noch keine erfahrung mit objektkomposition, funktionsparametern etc. hat, die solche singleton-geschichten obsolet machen.

                        das singleton-pattern ist völlig überschätzt und wird allein deswegen so häufig benutzt, weil es eines der einfachsten design patterns ist und ein entwickler unglaublich stolz ist, wenn er/sie damit endlich einen einstieg ins thema gefunden hat.

                        aber wenn die phantasie des programmierers nicht weiter reicht, hab ich lieber eine globale variable mehr im code als ein von-hinten-durch-die-brust-ins-auge-quasi-singleton, das an sich bereits das können des entwicklers völlig übersteigt und darüberhinaus noch fehleranfällig ist (siehe vergessenes "&" beim funktionsaufruf). keep it simple, stupid, die nächste debugging-session nachts um halb vier wird's dir danken.

                        grüße
                        axo
                        Zuletzt geändert von axo; 25.04.2007, 09:22.

                        Kommentar


                        • #27
                          Ich habe mal versucht Eurer Diskussion zu folgen, was nicht ganz so einfach ist.

                          Bitte bedenkt, dies ist mein Einstieg in OOP und leider kann ich auch nur PHP 4 nutzen. Dort ist OOP eingeschraenkt, ich weiss. Jeder hat aber mal angefangen und ich versuche mich muehsam durchzubeissen. Da bin ich natuerlich fuer jeden Tip hier dankbar.

                          @wahsaga

                          $DBConnection = DBConnection::init();

                          gilt das jetzt fuer meinen Aufbau? Meine Klasse heisst ja mysqlconnection
                          muss ich dann nicht

                          $DBConnection = mysqlconnection::init();

                          schreiben? Und statt init() getinstance?

                          Ist meine getinstance() Funtion in der DB Klasse denn so richtig? Brauche ich einen Konstruktor in der DB Klasse? Nur zum Verstandnis, ein Konstruktur ist eine Funktion, die aber den selben Namen wie die Klasse hat oder?

                          Ich bekomme in der Image Klasse immer den Fehler das er die mysqlconnection Klasse nicht kennt oder so. Bin jetzt leider nicht zu Hause um es genau zu sagen. Habe dann die DB Klasse in der Image Klasse eingebunden, aber ging immer noch nicht.

                          Ich versuche das wirklich zu verstehen und hoffe das Ihr Verstaendnis fuer meine Schwierigkeiten habt.

                          Gruss Luka

                          Kommentar


                          • #28
                            Original geschrieben von Luka

                            Ist meine getinstance() Funtion in der DB Klasse denn so richtig?
                            nein, sie ist nicht richtig. bleib bei deinen leisten, schuster.
                            erzeuge irgendwo ein db-objekt, und wo du es brauchst, machst du global $db und verwendest das dann so.

                            grüße
                            axo

                            Kommentar


                            • #29
                              @axo,

                              wenn ich immer bei meinen Leisten bleiben wuerde, wuerde ich mich nie weiterentwickeln. Man waechst an seinen Aufgaben. Zu sagen das ist nicht richtig und fertig ist mir zu wenig.

                              Schliesslich moechte ich lernen und das macht man aus Fehlern und von anderen, die einem vielleicht den einen oder anderen Tip geben.

                              Eine schnelle Loesung ist natuerlich nett wie, mach die Variable einfach Global und fertig, aber jetzt wuesste ich wirklich gerne, was an meiner Singleton Geschichte falsch ist.

                              Wuerde mich freuen, wenn jemand mir einen Tip gibt. Vielen Dank.

                              Gruss Luka

                              Kommentar


                              • #30
                                Original geschrieben von Luka
                                [B]@axo,

                                wenn ich immer bei meinen Leisten bleiben wuerde, wuerde ich mich nie weiterentwickeln. Man waechst an seinen Aufgaben. Zu sagen das ist nicht richtig und fertig ist mir zu wenig.
                                ich habe dir knapp 30 zeilen code gegeben, um dir zu zeigen, was du nicht richtig gemacht hast. das ganze nicht in einen editor zu kopieren, die datei nicht .php zu benennen und nicht mal auszuprobieren was passiert, das ist mir als anstrengung eines anfängers, ein problem zu verstehen, ebenfalls zu wenig.

                                Schliesslich moechte ich lernen und das macht man aus Fehlern und von anderen, die einem vielleicht den einen oder anderen Tip geben.
                                das habe ich gemacht, und dir mehr als genug tipps gegeben. du musst halt lesen können, mein lieber.


                                Eine schnelle Loesung ist natuerlich nett wie, mach die Variable einfach Global und fertig, aber jetzt wuesste ich wirklich gerne, was an meiner Singleton Geschichte falsch ist.
                                singleton an sich ist falsch, egal ob das jetzt "dein" oder "mein" singleton ist, lies halt mal mit!
                                Wuerde mich freuen, wenn jemand mir einen Tip gibt. Vielen Dank.
                                tipps sind soeben ausgegangen. jetzt setz dich auf den hosenboden und lies dir das wissen an, anstatt rumzuquatschen.

                                grüße
                                axo

                                Kommentar

                                Lädt...
                                X