OOP - Problem mit Vererbung

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

  • OOP - Problem mit Vererbung

    Hallo zusammen..

    Ich möchte mehrere Klassen miteinander vererben. Da man in PHP einer Klasse nur eine Klasse vererben kann hab ich eine 'Grundklasse' gemacht. Alle Klassen vererbe ich nun diese 'Grundklasse'.

    Mein Skript läuft nun folgendermassen ab:
    Die Grundklasse wird gestartet. Mit einer Funktion werden 4 Variabeln der Grundklasse beschrieben.
    Ich Starte eine andere Klasse (welche eine Vererbung der Grundklasse hat) Und will in einer Funktion auf die Variabeln, die davor in der Grundklasse gespeichert wurden zugreifen. Aber var_dump() gibt mir ein NULL.

    In der Grundklasse werden die Variabeln so festgelegt und beschrieben:
    PHP-Code:
    public $S_MYSQL_HOST;
    public 
    $S_MYSQL_USER;
    public 
    $S_MYSQL_PASSWORD;
    public 
    $S_MYSQL_DB;
    // ...
    function LoadConfigFile($file) {
        if(!
    file_exists($this->S_CONFIG_PATH.$file)) return false;
        include(
    $this->S_CONFIG_PATH.$file);
        echo 
    $this->S_MYSQL_HOST $mysql_host;
        echo 
    $this->S_MYSQL_USER $mysql_user;
        echo 
    $this->S_MYSQL_PASSWORD $mysql_password;
        echo 
    $this->S_MYSQL_DB $mysql_db;

    Die echo Befehle Dienen nur zu Testzwecken! Und diese Echo's geben auch den richtigen Inhalt aus!

    In der Anderen Klasse greife ich so auf die Variabeln von der Grundklasse zu:
    PHP-Code:
    function Start() {
        
    var_dump($this->S_MYSQL_DB);
        if (
    $this->connect mysql_connect($this->S_MYSQL_HOST$this->S_MYSQL_USER$this->S_MYSQL_PASSWORD)) {
            return 
    true;
        } else return 
    false;
            
    /**
             * Error: Verbindung konnte nicht hergestellt werden.
             */

    Auch hier dient var_dump() nur zu Testzwecken. Allerdings wird hier NULL ausgegeben!

    Meine Frage: Wiso wird NULL ausgegeben, wenn ich die Variabeln doch vorher gespeichert habe?
    Bücher für Programmierer

  • #2
    Rufst du in der zweiten Klassen denn überhaupt erstmal diese Funktion auf, in der die Variablen beschrieben werden?!

    Ist vielleicht ne dämliche Frage, aber oft sinds ja die einfachen Sachen die man nicht selbst sieht ;D

    Ansonsten: Wird nur diese Variable als NULL angezeigt oder auch alle anderes?
    This is what happens when an unstoppable force meets an immovable object.

    Kommentar


    • #3
      Also mein Skript, wo ich die Klassen aufrufe sieht ca. so aus:
      PHP-Code:
      error_reporting(E_ALL);
      require_once(
      'system/class.system.php');
      $sys = new System;     // System Starten
      $sys->LoadConfigFile('config.php');     // MySQL Config laden
      $sys->LoadSystemDrivers(); // Systemtreiber laden

      unset($sys);     // System beenden 
      LoadConfigFile()
      Hier wird die Konfigurationsdatei geladen und die Variabeln werden zugeordet.

      LoadSystemDrivers()
      Hier werden die restlichen Klassen geladen und gestartet.

      Alle Variabeln, die ich in der Funktion LoadConfigFile() gesetzt habe, beinhalten dort die NULL.
      Die anderen Variabeln, welche ich schon bei der deklaration gesetzt habe haben den Korekten wert und nicht NULL.
      Zuletzt geändert von andygyr; 31.05.2009, 13:18.
      Bücher für Programmierer

      Kommentar


      • #4
        ich hoffe, du hast extends nicht vergessen. und warum killst du das objekt mit unset($sys);? dafür gibt __destruct.

        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Extends ist bei der Klasse dran. Also 'extends Grundklasse' ..

          __destruct() wird doch per unset() aufgerufen? Oder hab ich mich da flasch informiert?
          Bücher für Programmierer

          Kommentar


          • #6
            Zitat von andygyr Beitrag anzeigen
            Mein Skript läuft nun folgendermassen ab:
            Die Grundklasse wird gestartet. Mit einer Funktion werden 4 Variabeln der Grundklasse beschrieben.
            Ich Starte eine andere Klasse (welche eine Vererbung der Grundklasse hat) Und will in einer Funktion auf die Variabeln, die davor in der Grundklasse gespeichert wurden zugreifen. Aber var_dump() gibt mir ein NULL.
            Das klingt jetzt nicht unbedingt so als ob du Objektorientierung verstanden hättest.

            Man "startet" keine Klassen und man speichert auch keine Variablen in Klassen.

            Man erzeugt Objekte einer Klasse. Und wenn du in einem solchen Objekt dann Variablen befüllst und anschließend ein Objekt einer Unterklasse erzeugst, dann hat das natürlich keine Ahnung von dem anderen Objekt.
            hopka.net!

            Kommentar


            • #7
              Wenn man jetzt mal nur den Ablauf anschaut würde das ca. so aussehen:
              PHP-Code:
              error_reporting(E_ALL);
              require_once(
              'system/class.system.php');
              $sys = new System;     // System Starten
              $sys->LoadConfigFile('config.php');     // MySQL Config laden
              $sys->LoadSystemDrivers(); // Systemtreiber laden
              $myslq = new MySQL();
              $mysql->Start(); 
              Wobei die Klasse MySQL mit der funktion Start auf die Variabeln der Klasse System zugreift, welche in der Funktion LoadConfigFile gesetzt wurden.
              Bücher für Programmierer

              Kommentar


              • #8
                Zitat von andygyr Beitrag anzeigen
                Wenn man jetzt mal nur den Ablauf anschaut würde das ca. so aussehen:
                PHP-Code:
                error_reporting(E_ALL);
                require_once(
                'system/class.system.php');
                $sys = new System;     // System Starten
                $sys->LoadConfigFile('config.php');     // MySQL Config laden
                $sys->LoadSystemDrivers(); // Systemtreiber laden
                $myslq = new MySQL();
                $mysql->Start(); 
                Wobei die Klasse MySQL mit der funktion Start auf die Variabeln der Klasse System zugreift, welche in der Funktion LoadConfigFile gesetzt wurden.
                Dann musst du aber $sys an das Objekt $mysql übergeben.

                Warum verwendest du übrigens nicht die bereits fertig mysqli-Klasse statt dem veralteten mysql-Mist?

                Kommentar


                • #9
                  Gibts keine andere möglichkeit, wie ich von einer Klasse die Variabeln der anderen Klasse nutzen kann?

                  Die MySQL Klasse die ich verwende habe ich selbst geschrieben..
                  Bücher für Programmierer

                  Kommentar


                  • #10
                    Für das Bereitstellen von Objekten gibt es verschiedene Design Pattern, zum Beispiel Singleton oder Registry. Oder du übergibst dem Mysql-Objekt eine Instanz der System-Klasse. Wie du es auch machst, so wie jetzt geht es auf jeden Fall nicht

                    Kommentar


                    • #11
                      Gibts keine andere möglichkeit, wie ich von einer Klasse die Variabeln der anderen Klasse nutzen kann?
                      eine möglich sähe z.b. so aus:
                      PHP-Code:
                      class A
                      {
                        protected 
                      $blubb;
                        protected function 
                      __construct ($bla)
                        {
                          
                      $this -> blubb $bla;
                        }
                      }

                      class 
                      extends A
                      {
                        public function 
                      __construct ($bla)
                        {
                          
                      parent::__construct ($bla);
                        }
                        
                        public function 
                      getBla()
                        {
                          return 
                      $this -> blubb
                        }
                      }

                      $a = new ('bluber');
                      echo 
                      $a -> getBla(); 
                      peter
                      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                      Meine Seite

                      Kommentar


                      • #12
                        Dann kann ich doch mit parent::Vriable auf eine Variable der Übergeordneten Klasse zugreifen!

                        Danke für den Tipp!
                        Bücher für Programmierer

                        Kommentar


                        • #13
                          Dann kann ich doch mit parent::Vriable auf eine Variable der Übergeordneten Klasse zugreifen!
                          nur wenn sie vom typ static ist.
                          PHP-Code:
                          class A
                          {
                            protected static 
                          $blubb;
                            protected function 
                          __construct ($bla)
                            {
                              
                          self::$blubb $bla;
                            }
                          }

                          class 
                          extends A
                          {
                            public function 
                          __construct ($bla)
                            {
                              
                          parent::__construct ($bla);
                            }
                            
                            public function 
                          getBla()
                            {
                              echo 
                          parent::$blubb
                            }
                          }

                          $a = new ('bluber');
                          $a -> getBla(); 
                          peter
                          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                          Meine Seite

                          Kommentar


                          • #14
                            Vielen Dank!

                            Das mit Static wusste ich, allerdings nicht, dass man sie Variable dann auch in der 'eigenen' Klasse noch mit self:: ansprechen muss. Klappt wunderbar!
                            Bücher für Programmierer

                            Kommentar


                            • #15
                              ich würde trotzdem hier nicht mit statischen eigenschaften arbeiten, sondern so:
                              PHP-Code:
                              class System
                              {
                                protected 
                              $S_MYSQL_HOST;
                                protected 
                              $S_MYSQL_USER;
                                protected 
                              $S_MYSQL_PASSWORD;
                                protected 
                              $S_MYSQL_DB
                                private   
                              $file;
                                protected function 
                              __construct($file
                                {
                                  
                              $this -> file //... usw.
                                
                              }
                              }

                              class 
                              MySql extends System 
                              {
                                public function 
                              __construct ($file)
                                {
                                  
                              parent::__construct ($file);
                                  echo 
                              $this -> S_MYSQL_USER;
                                }
                              }

                              $myslq = new MySQL(); 
                              trotzdem halte ich die vorgehensweise nicht für optimal. imho gehören die db-zugangsdaten ausschließlich in die mysql-klasse. und sollten vom typ private sein.

                              peter
                              EDIT:
                              außerdem solltest du dir mal autoload ansehen
                              Zuletzt geändert von Kropff; 31.05.2009, 16:03.
                              Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                              Meine Seite

                              Kommentar

                              Lädt...
                              X