vererben oder referenzen?

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

  • vererben oder referenzen?

    nabend allerseits

    mal ne grundsätzliche frage.
    wenn ich ne klasse zum generieren und bearbeiten von menüstrukturen hab, eine zur benutzerverwaltung, eine für polls, ...
    und diese klassen alle auf meiner db-klasse aufbauen, was is dann besser?

    sowas
    PHP-Code:
    class Menu extends SQL 
    oder
    PHP-Code:
    class Menu
    {
        function 
    Menu(&$db)
        {
          
    $this->_db=$db;
        }

    spöö ich also alle klassen die mit datenbanken arbeiten von der db-klasse ableiten oder im jeweiligen konstruktor ne refernz auf ine instanz der db-klasse übergeben?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    meine vorsichtige Schätzung in diesem Falle wäre, daß eine
    Referenz schneller und speichersparender ist.

    Die Klasse SQL hat ja ein paar Membervariablen, also
    muß für jede abgeleitete Klasse Speicher für diese
    Variablen bereitgestellt werden.
    Bei einer Referenz geschiet dies nur einmal.

    Inwiefern der Aufruf von $this->MethodederVaterklasse
    das gegenüber Aufrufen $this->Referenz->MethodederVaterklasse
    wieder wettmacht, kann ich nicht sagen.
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      also mit der stoppuhr hinstellen und messen

      wobei die sache mit der refernzmir ja nur was bringt wenn ich auch in meinem eigentlichen skript mit $db arbeite oder?
      sonst hab ich da ne variable rumgeistern die da rein logisch nix zu suchen hat

      meine fresse is php kompliziert; entweder man optimiert geschwindigkeit oder ressourcen oder man baut das logisch auf...

      OffTopic:
      unsere threads könnte man fast zusammenlegen :d


      zusammenfassuend:
      refernez: speicherschonend

      vererbung: evtl. schneller, da keine derefenzierung und ähnliches gedöns nötig is

      soweit richtig?

      am besten wäre dann wohl wenn ich wahlweise ne referenz übergeben oder ableiten könnte

      mrhappiness, wunschdenkt
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        wie ich es gemacht habe, weisst du ja. du hast mir ja auch ein paar tipps gegeben....

        für die anderen: ich mache das mit referenzen

        von der performance her kann ich ncihts sagen, da das ding nie unter volllast war oder kommen wird.

        sonst hab ich da ne variable rumgeistern die da rein logisch nix zu suchen hat
        das stimmt nicht ganz.

        dadurch, dass ich immer referenzen gemacht habe, kann ich z.b. jede sql-query zählen und am ende im 'hauptscript' eine ausgabe machen, wieviele queries es waren. ausserdem kann ich diese gleiche zahl auch in den classen verwenden, die die db referenziert haben.

        wie ist das eigentlich mit den verbindungen zur db, wenn ich viele viele male das mysql-ding in die neuen classen ableite? oder bleibt doch nur eine connection offen?


        wo wir gerade dabei sind.....

        wie ist unterschied im speicherverbrauch?
        PHP-Code:
        // klasse normal
        class cl1
        {
            function 
        cl1() { }
        }

        // klasse als ref.
        class cl2
        {
            function &
        cl2() { }

        happy und ich sind nicht zu einer endgültigen lösung gekommen? oder doch?
        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


        • #5
          Original geschrieben von Abraxax
          das stimmt nicht ganz.
          außer ich brauche $db in meinem skript nur, um es als refernz weiterzugeben ohne effektiv damit zu arbeiten
          wie ist das eigentlich mit den verbindungen zur db, wenn ich viele viele male das mysql-ding in die neuen classen ableite? oder bleibt doch nur eine connection offen?
          mysql_connect(host, user, pass, new_connection=false)
          so sieht's aus
          wie ist unterschied im speicherverbrauch?
          PHP-Code:
          // klasse normal
          class cl1
          {
              function 
          cl1() { }
          }

          // klasse als ref.
          class cl2
          {
              function &
          cl2() { }

          happy und ich sind nicht zu einer endgültigen lösung gekommen? oder doch?
          PHP-Code:
          $cl1=&new cl1();
          $cl2=new cl2(); 
          sollte dann im endeffekt das gleiche sein

          ich denke es ist egal wo du mit der referenz arbeitest, evtl. kriegst du mit variante2 aber auch ne kopie auf die referenz

          aber frag mich nich wie man das rauskriegt
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Original geschrieben von mrhappiness
            aber frag mich nich wie man das rauskriegt
            lieb zum piko-geizer TBT geschaut...
            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


            • #7
              ich machs so wie Haxe das macht. Oder soll ich sagen, Haxe macht das so wie ich das mach???

              Hatte da mal nen Thread zu aufgemacht....

              Kommentar


              • #8
                Re: vererben oder referenzen?

                Ich mache es auch mit Referenzen, bzw. bin dabei es mit Referenzen zu machen, hab ja sooo viel zu tun

                Original geschrieben von mrhappiness
                PHP-Code:
                class Menu
                {
                    function 
                Menu(&$db)
                    {
                      
                $this->_db=$db;
                    }

                Ich mach das aber so:
                PHP-Code:
                class Menu
                {
                    function 
                Menu(&$db)
                    {
                      
                $this->_db=&$db;
                    }

                also noch ein & mehr, sonst läuft es nicht richtig.

                P.S.:
                Mit "es" ist das übergeben einer Datenbankklasse gemeint, nur das wir uns verstehen
                hopka.net!

                Kommentar


                • #9
                  toll wie du es machst

                  ich werd's wohl genauso machen

                  hab mir mittlerweile sogar überlehgt dass ableiten in so nem fall schon fast falsch wäre, da menu keine spezialisierung von db is
                  PHP-Code:
                  $menu=new menu(new db());

                  //constructor menu
                  function &menu(&$db)
                  {
                    
                  $this->db=&$db;
                  }

                  //constructor db
                  function &db() 
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    eine ungefähre Größe der Speicherbenutzung kannst du
                    mit Windows ermitteln.

                    Dazu im Script per Debugger mehrere Haltepunkte definieren,
                    und dort immer im Taskmanager nachschauen, wieviel Ram
                    der Prozess benötigt.

                    Man kann zwar nicht die genaue Größe ermitteln, aber immerhin
                    die Aussage treffen ob es mehr oder weniger geworden ist
                    nach einer Änderung.
                    TBT

                    Die zwei wichtigsten Regeln für eine berufliche Karriere:
                    1. Verrate niemals alles was du weißt!


                    PHP 2 AllPatrizier II Browsergame

                    Kommentar


                    • #11
                      Original geschrieben von Abraxax
                      wie ich es gemacht habe, weisst du ja. du hast mir ja auch ein paar tipps gegeben....

                      für die anderen: ich mache das mit referenzen

                      von der performance her kann ich ncihts sagen, da das ding nie unter volllast war oder kommen wird.

                      das stimmt nicht ganz.

                      dadurch, dass ich immer referenzen gemacht habe, kann ich z.b. jede sql-query zählen und am ende im 'hauptscript' eine ausgabe machen, wieviele queries es waren. ausserdem kann ich diese gleiche zahl auch in den classen verwenden, die die db referenziert haben.

                      wie ist das eigentlich mit den verbindungen zur db, wenn ich viele viele male das mysql-ding in die neuen classen ableite? oder bleibt doch nur eine connection offen?


                      wo wir gerade dabei sind.....

                      wie ist unterschied im speicherverbrauch?
                      PHP-Code:
                      // klasse normal
                      class cl1
                      {
                          function 
                      cl1() { }
                      }

                      // klasse als ref.
                      class cl2
                      {
                          function &
                      cl2() { }

                      happy und ich sind nicht zu einer endgültigen lösung gekommen? oder doch?
                      der Zuweisungoperator = macht eine Kopie vom Object, also immer

                      $obj = & new Object();

                      machen.

                      Damit immer Referenzen genutzt werden, hier mal die Regeln
                      zum schreiben:

                      1. Konstruktion
                      $obj = & new Object();

                      2. Parameter:
                      function x( &$param ){
                      $this->bla = &$param;
                      }

                      Aufruf eines Object mit neuem Object also

                      $obj = & new Object ( new Object2() );

                      mit
                      function Object ( &$anderesObject ){
                      $this->anderesObject = &$anderesObject;
                      }
                      TBT

                      Die zwei wichtigsten Regeln für eine berufliche Karriere:
                      1. Verrate niemals alles was du weißt!


                      PHP 2 AllPatrizier II Browsergame

                      Kommentar


                      • #12
                        Original geschrieben von TBT
                        Damit immer Referenzen genutzt werden, hier mal die Regeln
                        zum schreiben:
                        danke@TBT

                        d.h. heisst aber auch, dass das & im contructor totaler müll bei mir wäre. richtig?

                        bisher habe ich es so.

                        PHP-Code:
                        class Object
                        {
                          function &
                        Object ( &$anderesObject ){
                            
                        $this->anderesObject = &$anderesObject;
                          }
                        }

                        $obj = new Object($anderesobject); 
                        wenn ich dich richtig verstanden habe, bringt mir das aber nix. ich muss das & unbegingt bei new angeben, um die ref zu bekommen?

                        PHP-Code:
                        class Object
                        {
                          function 
                        Object ( &$anderesObject ){
                            
                        $this->anderesObject = &$anderesObject;
                          }
                        }

                        $obj = &new Object($anderesobject); 
                        sorry, wenn ich noch einmal nachfragen muss, aber in mache das mit den refs quasi auch zum ersten mal richtig. bzw will es richtig machen.
                        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


                        • #13
                          das & im Konstruktor ist Müll,
                          aber bei new ist es wichtig

                          wenn du aus Funktionen Referenzen zurückgeben
                          willst mußte das mit & in der Funktion machen, und mit
                          & übernehmen.
                          Also so:


                          function & abc(){
                          return $x;
                          }

                          $y = & abc();
                          TBT

                          Die zwei wichtigsten Regeln für eine berufliche Karriere:
                          1. Verrate niemals alles was du weißt!


                          PHP 2 AllPatrizier II Browsergame

                          Kommentar


                          • #14
                            ok. jetzt habe ich es besser verstanden...

                            am contruktor selber kein & aber dafür bei new. thx.
                            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


                            • #15
                              edit: ach, verflucht, ich idiot hatte noch eine if-abfrage rund um das initialisieren der usermanagement klasse, die nicht erfüllt war,
                              nun funktionierts


                              ich habe nun wohl alle denkbaren möglichkeiten durchprobiert, aber ich kriege meine datenbank klasse einfach nicht in das drecks usermanagement referenziert

                              ich mach es so:

                              PHP-Code:
                              <?
                              $db = new Database(DATABASE_HOSTNAME, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_TYPE, TRUE, DATABASE_PERSISTENT);

                              $usermanagement = new Usermanagement($username, $password, &$db);
                              ?>
                              (&$db weil ich mit dem selben objekt in der normalen datei ja auch arbeiten will, und &new Database(...) wie oben irgendwo beschrieben gibt einen fehler, und müsste nach logischer denkweise sowieso ein neues objekt kopieren)
                              und im konstruktor:

                              PHP-Code:
                              <?
                              function Usermanagement($username, $password, &$databaseobject) {
                                  $this->username       = $username;
                                  $this->password       = $password;
                                  $this->databaseobject = &$databaseobject;
                                  $this->databaseobject->sendQuery("SELECT * FROM sessions");
                              }
                              ?>
                              doch wenn ich am ende der index datei die db statistiken abfrage, steht da nach wie vor 0 queries ausgeführt
                              ich kriege auch gar keine datenbankverbindung in der klasse zustande, wie ich gerade an einem insert-befehl getestet habe
                              Zuletzt geändert von invitatoinvitat; 05.02.2004, 22:08.

                              Kommentar

                              Lädt...
                              X