[OOP] In einer Klasse eine andere Klasse verwenden?

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

  • [OOP] In einer Klasse eine andere Klasse verwenden?

    Hallo alle zusammen,

    ich zerbrech mir jetzt schon seit Wochen den Kopf darüber wie ich die Methoden der Klasse db in die Klasse test bekomme.

    Also nochmal etwas genauer:
    Ich habe eine Klasse db, die eine Verbindung zur Datenbank herstellt und die abfrage functionen enthält, die ganze Klasse befindet sich in der datei "class.datenbank.php".
    Die Klasse db besitz einen Konstructor, der da alles regelt wie's sein soll

    So nun habe ich noch eine 2te Klasse, namens "test".
    In dieser Klasse brauche ich nun einmal die Function sql_query().

    Doch nun mein Problem, wie bekomme ich die Methode der Klasse "db" in die Klasse "test".

    Muß ich in der Klasse Test nochmal die DB Klasse aufrufen?
    Oder kann man durch die verwendung global die schon in der Index.php initalisierte Klasse DB in die Klasse Test einbinden??

    Oder gibt es irgendeine Superfunction, die in der lage ist das zu bewerkstelligen?


    Muß dazusagen, dass dies mein 4ter Versuch ist mit Klassen ist. 2mal gings bis jetzt, aber da konnte ich dieses Problem noch elegant umgehen, diesmal klappt das leider nicht
    Oder ist es vielleicht Sinnvoller die Klasse Test zu eliminieren und die ganzen Funktionen in eine Datei zu packen?


    Hoffe ihr versteht mein Prob und es kann mir da jemand helfen, denn ich will auch mal so gut wie ihr in PHP werden

    Grüßle
    Jamie Wolf
    Nicht jeder der viele Posts hat weiß auch viel

  • #2
    du kannst in der Klasse Test jede Funktion eines bereits instanzierten (schreibt man das so ?) Objekts benutzen, genau so wie auch sonst...


    Und mischen würde ich es nicht, DB-Funktionen bleiben schön in der DB-Klasse und die test-funktionen bleiben "unter sich"


    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

    Kommentar


    • #3
      Da gibt es grundsätzlich zwei Ansätze (die halbwegs Sinn machen):

      1. Per global einbinden (wie du's gesagt hast). Die wohl unsauberste Methode, weil sie das ganze OOP-Konzept kaputt machen würde. Die Klasse wäre dann nämlich von äußeren Einflüssen abhängig.

      2. Eine Property in der Test-Klasse erstellen, die eine Instanz der DB-Klasse hält. Der kannst du dann das Objekt im Konstruktor zuweisen.
      Zuletzt geändert von Nezzar; 26.08.2004, 13:34.
      "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

      Kommentar


      • #4
        2. Eine Property in der Klasse erstellen, die eine Instanz der DB-Klasse hält. Der kannst du dann das Objekt im Konstruktor zuweisen.
        Warum kann der Konstruktor das DB nicht einfach selber erzeugen ?
        Oder widerspricht das auch dem OOP Konzept ? Warum das DB Objekt außerhalb der KLasse erzeugen und dem Konstruktor übergeben ?

        Vielleicht braucht doch jedes Skript sowieso die DB Funktionen?

        Aber aus Sicht der Wiederverwendbarkeit ? Hmmm ...
        Pickel ? Übergewicht ? Depressionen ?
        Brot, Kartoffeln und Milch sind Gift!
        http://www.paleofood.de

        Kommentar


        • #5
          Durch das übergeben kann man umgehen, dass das Objekt durch kein zweites Mal instanziert wird (das könnte zwar beabsichtigt sein, ist es hier aber vermutlich nicht).
          "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

          Kommentar


          • #6
            Also sollte ein Objekt nie ein anderes erzeugen ?
            Pickel ? Übergewicht ? Depressionen ?
            Brot, Kartoffeln und Milch sind Gift!
            http://www.paleofood.de

            Kommentar


            • #7
              Doch. Klar dürfen die das, es ging mir nur darum zu vermeiden, dass das Objekt mehrmals erzeugt wird (was, wie gesagt, hier vermutlich nicht beabsichtigt ist).
              "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

              Kommentar


              • #8
                Aber gibt es einen Vorteil?

                Warum sollte ein Objekt ein anderes Objekt erzeugen und nicht jedes benötigte vom "Hauptprogramm" bekommen, oder in Java von der main Methode erzeugten Objekten ?
                Pickel ? Übergewicht ? Depressionen ?
                Brot, Kartoffeln und Milch sind Gift!
                http://www.paleofood.de

                Kommentar


                • #9
                  Original geschrieben von antman
                  Aber gibt es einen Vorteil?

                  Warum sollte ein Objekt ein anderes Objekt erzeugen und nicht jedes benötigte vom "Hauptprogramm" bekommen, oder in Java von der main Methode erzeugten Objekten ?
                  Es spart Speicherplatz?

                  Wenn ich die Funktionalität einer Klasse nur unter bestimmten Umständen brauche, dann erzeuge ich ein Objekt dieser Klasse nur dann, wenn eben diese Umstände eingetreten sind und wenn ich fertig bin entferne ich das Objekt wieder aus dem Speicher
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Original geschrieben von antman
                    Aber gibt es einen Vorteil?

                    Warum sollte ein Objekt ein anderes Objekt erzeugen und nicht jedes benötigte vom "Hauptprogramm" bekommen, oder in Java von der main Methode erzeugten Objekten ?
                    Das tut es doch. Der Konstruktor der Testklasse erhält eine Referenz auf das vom Hauptprogramm erzeugte Objekt und kann diese dann weiterverwenden. Wie mrhappiness schon sagte, es spart eben Speicher.
                    "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                    Kommentar


                    • #11
                      hmm euere Anworten scheinen mir alle logisch Doch hat es bei mir bis jetzt noch nicht so ganz *klack* gemacht wie ich das nu in "schönem" PHP COde aus drücke.

                      Ich hatte mir folgende ausführung des Scripts überlegt:[list=1][*]index.php -> include der Klasse DB; include der Klasse Test[*]$db = new DB("localhost", "root", "password", "datenbank");[*]$test = new TEST();[/list=1]
                      So damit sind die Klassen initialisiert und ich kann sie verwenden.
                      • Ein paar abfragen mit der Klasse TEST, und da wird jetzt bei $test->irgendwas(); die methode sql_query gebraucht
                      • Nun wieder normal code mit ein paar datenbank abfragen
                      • Noch nen bissel aus TEST (ohne SQL oder mit, is ja egal)
                      • Ende


                      Wie müßte ich dass in der Klasse TEST schreiben wenn ich die Methode sql_query aus DB verwenden will?


                      Danke schonmal an die Poster
                      Nicht jeder der viele Posts hat weiß auch viel

                      Kommentar


                      • #12
                        Original geschrieben von mrhappiness
                        Es spart Speicherplatz?

                        Wenn ich die Funktionalität einer Klasse nur unter bestimmten Umständen brauche, dann erzeuge ich ein Objekt dieser Klasse nur dann, wenn eben diese Umstände eingetreten sind und wenn ich fertig bin entferne ich das Objekt wieder aus dem Speicher
                        Ja eben, wo gibt es denn dann einen Speicherplatzunterschied ?

                        Wenn ich im Hauptprogramm die DB Klasse erzeuge und diese an den Konstruktor der Testklasse übergebe. Habe ich 2 Objekte im Speicher.

                        Wenn ich im Hauptprogramm die Klasse Test erzeuge und die Klasse Test instanziert in seinem Konstruktor die DB Klasse habe ich wieder 2 Objekt im Speicher.

                        Wo hat man bitte Speicherplatz gespart ?
                        Pickel ? Übergewicht ? Depressionen ?
                        Brot, Kartoffeln und Milch sind Gift!
                        http://www.paleofood.de

                        Kommentar


                        • #13
                          @JamieWolf

                          schaue mal hier ...
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar


                          • #14
                            In dem man Referenzen benutzt.
                            PHP-Code:
                            class Test
                            {
                              var 
                            $db;

                              function 
                            test(&$db)
                              {
                                
                            $this->db = &$db;
                              }

                            PHP-Code:
                            //die includes hier

                            $db = new DB();
                            $test = new Test($db); 
                            Edit: Mist, Abraxax war schneller
                            "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                            Kommentar


                            • #15
                              Wenn ich im Hauptprogramm die Klasse Test erzeuge und die Klasse Test instanziert in seinem Konstruktor die DB Klasse habe ich wieder 2 Objekt im Speicher.
                              Ganz einfach, die DB klasse brauche ich ja nicht nur in der Klasse TEST, sondern auch wo anders.
                              Wie man in meinem Post über deinem sehen kann

                              Und der Mehr verbrauch an Speicher ist einfach da dass wenn DB schon existiert es nochmal zu erzeugen in TEST
                              Also hab ich dann kurzfristig zumindestens 3 Objekte im Speicher. Nun rechne mal hoch, wenn 100 User online sind und die gleiche Seite abfragen, dann hast du 100 Objekte mehr im Speicher (2 * 100 - 3 * 100 = 100 ) und je nach dem wie groß diese Objekte sind kann es da schon zu erheblichen Speichereinbußen kommen.

                              Bin zwar noch a bissel a Noob, aber dass schnall selbst ich
                              Nicht jeder der viele Posts hat weiß auch viel

                              Kommentar

                              Lädt...
                              X