Vererbung von Klassen?

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

  • Vererbung von Klassen?

    Hallo,

    ich habe ein Klasse MYSQL - sie ist die Hauptlkasse.
    Dann hab ich eine Klasse LOGIN die die Klasse MYSQL erbt.

    Also

    class mysql {
    }

    class login extends mysql {
    }

    soweit so gut.

    Jetzt hab ich 2 Fragen...

    1. Frage:

    Wenn ich im Konstruktor die Datenbankverbindung in der Klasse MYSQL aufbaue, scheint diese dann in der Instanz der LOGIN-Klasse nicht vorhanden zu sein!
    Gibts da eine Lösung oder muss ich in der LOGIN-Klasse eine neue Instanz der MYSQL-Klasse bilden.
    Hätte es aber gern so, da die Verbindung für alle Unterklassen da ist. Geht das?

    Also, ich stell in der Klasse MYSQL eine Verbindung her, und rufe dann in der Klasse LOGIN die Funktion db::sql_query() auf.
    Hier ist die Verbindung dann scheinbar nicht mehr da!

    2. Frage:

    Kann ich aus der Unterklasse LOGIN auf eine Variable der Klasse MYSQL zugreifen - ohne extra dafür eine Funktion zu erstellen, die ich dann DB::ZeigVariable() angezeigt bekomme?

    Danke!

  • #2
    2) parent::fkt()
    1) ich würde einen Konstruktor für die Kindklasse anlegen, welche den Konstruktor der Elternklasse mit entsprechenden Werten aufruft.
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Hier ist die Verbindung dann scheinbar nicht mehr da!
      Nein, du vererbst ja keine Instanz der Klasse.

      1) Hier könnte ein Singelton dir weiterhelfen. Dann hast du immer eine Version der Klasse MySQL (ohne Vererbung).
      2) Nur wenn die Variable schon im Entwurf der Klasse definiert ist.
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        zu 2. Ich will aber keine Funktion aufrufen, sonder auf eine Variable zu greifen.


        zu 1.

        das Problem ist das ich das Handle der mysql-verbindung verliere. Das singleton stellt doch dann auch nur wieder eine neue instanz auf, das wäre ja dann eine weiter sql-verbindung. das wäre für die performance nicht grad so toll, oder versteh ich da was falsch?

        Kommentar


        • #5
          vgl. http://www.it-academy.cc/article/146...QL+Klasse.html

          die idee ist es, die resource der verbindung als (u.u. statische) eigenschaft der mysql klasse zu speichern und z.b. mittels singleton zu initialisieren. alle unterklassen können dann im konstruktor den parent-konstruktor aufrufen, der die instanz anlegt und weiter über parent::$connection auf die db zugreifen. so werden instanzen aller klassen des laufenden skripts die selbe verbindung zur db nutzen.

          andererseits - rtfm zu mysql_connect. die idempotenz dieser funktion besteht darin, auch bei mehreren aufrufen nur eine verbindung zu nutzen (s. vierten parameter).
          Zuletzt geändert von penizillin; 24.07.2007, 13:05.

          Kommentar


          • #6
            zu 2. Ich will aber keine Funktion aufrufen, sonder auf eine Variable zu greifen.
            parent::Variable - wie gesagt nur für Variablen die nicht zu einer Instanz gehören.
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              danke. denn sinn versteh ich schon, aber die umsetzung nicht ganz. ich muss also, bei aufruf der select-funktion die resource-id an die select-funktion mit übergeben!? eigentlich ist diese ja schon drin definiert, oder?

              so sieht meine sql-klasse aus. wie müsste ich die umändern?

              PHP-Code:
              <?php
                  
              class db {
                  
                      protected   
              $host         'localhost';
                      protected   
              $user         'root';
                      protected   
              $pass         '';
                      protected   
              $dbname       'cnet';
                      protected   
              $connection   NULL;
                      public      
              $numquerys    0;
                      public      
              $numrows      0;
                  
                      
              /**
                       *  Konstruktor
                       */
                      
              function __construct()
                      {
                          
              // MySQL Verbindung herstellen
                          
              if (!$this->connect())
                              die (
              mysql_error($this->connection));
                      }

                      
              /**
                       *  Destruktor
                       */
                      
              function __destruct()
                      {
                          
              // MySQL Verbindung schließen
                          
              if (!mysql_close($this->connection))
                              die (
              mysql_error($this->connection));
                      }

                      
              /**
                       *  Stellt eine MySQL-Verbindung her
                       */
                      
              protected function connect()
                      {
                          
              // Verbindnung herstellen
                          
              $this->connection mysql_connect($this->host$this->user$this->pass);
                          if (!
              $this->connection)
                          {
                              return 
              0;
                          }
                          
              // Datenbank auswählen
                          
              if (!mysql_select_db($this->dbname))
                          {
                              return 
              0;
                          }
                          return 
              1;
                      }

                      
              /**
                       *  Führt eine SQL-Query aus (INSERT,UPDATE,DELETE...)
                       */
                      
              public function query($statment)
                      {
                          if (
              $this->connection)
                          {
                              
              $result = @mysql_query($statment$this->connection);
                              if (
              $result)
                                  
              $this->numquerys++;
                              else
                                  echo 
              $statment.'<br />'.mysql_error($this->connection);
                              return 
              $result;
                          }
                      }

                      
              /**
                       *  Führt eine SQL-Select aus (SELECT)
                       */       
                      
              public function select($statment)
                      {
                          echo 
              '>>>'.$this->connection.'<<<';
                          if (
              $this->connection)
                          {
                              
              $arrReturn = array();
                              
              $this->numrows 0;
                              
              $result = @mysql_query($statment$this->connection);
                              if (
              $result)
                              {
                                  
              $this->numquerys++;
                                  while (
              $arrData = @mysql_fetch_array($result))
                                  {
                                      
              $arrReturn[] = $arrData;
                                      
              $this->numrows++;
                                  }
                              }
                              else
                              {
                                  echo 
              $statment.'<br />'.mysql_error($this->connection);
                                  return 
              0;
                              }
                              return 
              $arrReturn;
                          }
                      }

                      
              /**
                       *  Gibt die Anzahl des letzten gefundenen Treffers zurück
                       */
                      
              public function numrows()
                      {
                          return 
              $this->numrows;
                      }

                      
              /**
                       *  Gibt die Anzahl des letzten gefundenen Treffers zurück
                       */
                      
              public function numquerys()
                      {
                          return 
              $this->numquerys;
                      }

                      
                      
              /**
                       *  Wechselt die Datenbank
                       */
                      
              public function changedb($database)
                      {
                          if (
              $this->connection)
                              if (!
              mysql_select_db($database))
                              {
                                  die (
              mysql_error($this->connection));
                                  return 
              0;
                              }
                              else
                              {
                                  return 
              1;
                              }
                      }

                  }
              ?>

              und in der LOGIN-Klasse gibt es Funktion die die Select-Funktion aufruft, aber eben die Resource fehlt. Wie müsste die aussehen?


              PHP-Code:
              class login extends db {
              ...
                      public function 
              login($username,$password)
                      {
                         
              $arrResult parent::select("SELECT userid,active FROM users 
              WHERE (username='"
              .$username."' AND password='".md5($password)."') LIMIT 1");
                         echo 
              parent::numrows(); // Zum test eine ausgabe
                      
              }
              ...

              Zuletzt geändert von TriphunEM; 26.07.2007, 12:03.

              Kommentar


              • #8
                sieht doch gut aus.. nur noch den parent konstruktor aufrufen nicht vergessen.

                p.s. nicht parent::select.. this->select war schon richtig.

                Kommentar


                • #9
                  rtfm zu mysql_connect.
                  Für den Fall, dass ein zweiter Aufruf von mysql_connect() mit den gleichen Argumenten erfolgt, wird keine neue Verbindung aufgebaut, sondern die Verbindungs-Kennung der schon bestehenden Verbindung zurückgeliefert. Der Parameter neue_Verbindung beeinflusst dieses Verhalten und mysql_connect() öffnet immer eine neue Verbindung, sogar dann, wenn mysql_connect() zu einem früheren Zeitpunkt mit den gleichen Parametern aufgerufen wurde.
                  Oder so. Und jetzt löscht du erstmal den unnützen Code daraus. (Denk daran im Konstruktor von login parent::__construct ( ) aufzurufen.)
                  Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                  Kommentar


                  • #10
                    Wofür brauchst du deine "SQL-Klasse"?
                    Es gibt doch creole oder PDO oder ADODB oder oder oder ...

                    Kommentar


                    • #11
                      Original geschrieben von frido37
                      Wofür brauchst du deine "SQL-Klasse"?
                      Es gibt doch creole oder PDO oder ADODB oder oder oder ...
                      Das ist keine gute Philosophie, wenn du mich fragst. Seiner "SQL-Klasse" fehlt ohne Zweifel noch so einiges, um an die von dir genannten heranzukommen. Aber Übung macht den Meister, und zur Übung sind Fertigprodukte nur bedingt geeinget.
                      Für den Fall, dass die programmiertechnische Umsetzung zwecks Übung hier nicht gefragt ist, sondern nur nach der bestmöglichen Lösung gesucht wird, ziehe meine Behauptung natürlich zurück.
                      Nieder mit der Camel Case-Konvention

                      Kommentar


                      • #12
                        danke. es klappt soweit alles.

                        aber das Problem ist, da ich trotzdem mit $this-> auf eine Funktion der oberklasse zugreifen muss. ist natürlich blöd, weil ich dann jeder funktion einer Klasse einen eindeutigen namen geben muss, sonst kommt man durch einander!

                        gibts da ne möglichkeit?

                        also sprich, das ich eine funktion einer oberklasse mit klassenname+funktionsname ansprechen kann? aber trotzdem die resource, wie oben besproche, behalte???

                        Kommentar


                        • #13
                          gibts da ne möglichkeit?
                          Nein, so nicht, aber bei zwei zusammengeführten Klassen sollte das kein Problem sein oder? Und ohne Bezug vererben sollst du sowieso nicht.
                          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                          Kommentar

                          Lädt...
                          X