Ankündigung

Einklappen
Keine Ankündigung bisher.

Klassendeklationsfehler

Einklappen

Neue Werbung 2019

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

  • Klassendeklationsfehler

    Guten Abend,




    ich suche nun schon seit gerungener Zeit nach einer Lösung. Ich habe eine Klasse in der ich eine Variable $dbObj als null deklariere. Im Konstruktor wird dieses Objekt $dbObj dann mit dem DatabaseObject deklariert. Dann habe ich noch eine Getter-Methode erstellt. Wenn ich diesen aber in anderen Klassen verwende, ist MYCLASS::getDB() immer NULL, sprich die Methode returnt nichts.



    PHP-Code:
      class NetworkManager {      public $tplManager;     protected static $db null;      /**      * @return Database      */     public static function getDB()     {         return self::$db;     }      /**      * NetworkManager constructor.      */     public function __construct()     {         $this->initDatabase();      }      protected function initDatabase(){         self::$db = new Database("*""*""*""*");     }      /**      * NetworkManager destructor.      */     public function __destruct()     {         self::$db null;     }  } 

  • #2
    Glückwunsch, du hast einen der vielen Nachteile von statischen Variablen und Funktionen entdeckt! Ich würde dir raten static so gut es geht zu vermeiden und nur ganz ganz bewusst einzusetzen. Und im Zweifel static nicht verwenden.

    Du solltest übrigens nicht eine Datenbankverbindung in einer Klasse aufbauen, die dafür nicht zuständig ist.

    Kommentar


    • #3
      Zitat von hellbringer Beitrag anzeigen
      Glückwunsch, du hast einen der vielen Nachteile von statischen Variablen und Funktionen entdeckt! Ich würde dir raten static so gut es geht zu vermeiden und nur ganz ganz bewusst einzusetzen. Und im Zweifel static nicht verwenden.
      Das ist kein Nachteil von static, sondern einfach static falsch eingesetzt.

      Überleg mal was deine Funktion initDatabase() macht - sie initialisiert eine Klassenvariable. Klassenvariablen sind aber (im Gegensatz zu Objektvariablen) eben abhängig von der KLASSE, nicht vom Objekt. Du vermischt hier Dinge. Kann mir auch kaum vorstellen, dass es dabei keine Meldung gibt wenn du versuchst so auf die Properties zuzugreifen. (Java jedenfalls bringt eine wenn man static properties im Objektkontext angreift.)

      Kommentar


      • #4
        Okay, danke erstmal. Aber wie behebe ich den Fehler nun?

        Kommentar


        • #5
          Da hier static offensichtlich nicht notwendig ist, lässt du es weg.

          Und das Database-Objekt erstellst du nicht in der Klasse, sondern übergibst es als Parameter im Konstruktor.

          Kommentar


          • #6
            Zitat von hellbringer Beitrag anzeigen

            Und das Database-Objekt erstellst du nicht in der Klasse, sondern übergibst es als Parameter im Konstruktor.
            Habe jetzt static entfernt. Wie soll ich es im Konstruktor übergeben? In der Database Klasse?

            Kommentar


            • #7
              PHP-Code:
              class NetworkManager {
                  private 
              $db;

                  public function 
              __construct(Database $db) {
                      
              $this->db $db;
                  }

              PHP-Code:
              $db Database("*""*""*""*");
              $networkManager = new NetworkManager($db); 

              Kommentar


              • #8
                Okay, vielen Dank. Hätte noch eine Frage: Wie kann ich denn jetzt von überall aus auf $db zugreifen?

                Kommentar


                • #9
                  Wat heißt denn "von überall"? Du deklarierst $db in einem Scope, idealerweise im globalen Scope.
                  Dort wo Du es benötigst übergibst Du das, wie beim NetworkManager.
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Zitat von InfectedCoding Beitrag anzeigen
                    Okay, vielen Dank. Hätte noch eine Frage: Wie kann ich denn jetzt von überall aus auf $db zugreifen?
                    Gar nicht, den von "überall" bedeutet, dass etwa global verfügbar ist. Und das bedeutet globale Abhängigkeiten und widerspricht eigentlich dem Prinzip der objektorientierten Programmierung.

                    Ganz einfache Regel: Wenn eine Klasse ein Datenbankobjekt benötigt, übergib es im Konstruktor

                    In weiterer Folge kann man sich auch mal mit Dependency Injection beschäftigen. Das kann einem einiges an Arbeit abnehmen.

                    Kommentar


                    • #11
                      Okay, vielen Dank. Jetzt kommt nur noch ein Fehler: Fatal error: Uncaught Error: Call to undefined function lib\files\system\database\mysql_connect() in

                      Kommentar


                      • #12
                        Mal abgesehen davon, dass mysql_* eine schlechte Wahl ist - warum steht in der Doku -, solltest Du die Meldung mal komplett posten.
                        Es steht nämlich eine Datei und die Zeilennummer dabei, wo Du den Fehler finden wirst,
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          Code:
                          Fatal error: Uncaught Error:
                          Call to undefined function lib\files\system\database\mysql_connect() in C:\Users\Admin\Desktop\NetworkManager\lib\files\sy stem\database\Database.class.php:63
                          Stack trace:
                          #0 C:\Users\Admin\Desktop\NetworkManager\lib\files\sy stem\database\Database.class.php(78): lib\files\system\database\Database::connection()
                          #1 C:\Users\Admin\Desktop\NetworkManager\lib\files\sy stem\database\Database.class.php(92): lib\files\system\database\Database::__where(Array)
                          #2 C:\Users\Admin\Desktop\NetworkManager\lib\files\sy stem\permissions\SessionManager.class.php(22): lib\files\system\database\Database->where(Array)
                          #3 C:\Users\Admin\Desktop\NetworkManager\index.php(21 ): lib\files\system\permissions\SessionManager::login Check('Test', 'test', Object(lib\files\system\database\Database))
                          #4 {main} thrown in C:\Users\Admin\Desktop\NetworkManager\lib\files\sy stem\database\Database.class.php on line 63

                          Kommentar


                          • #14
                            PHP-Code:
                            static private
                            function 
                            connection()
                            {

                            if (!
                            is_resource(self::$link) || empty(self::$link))
                            {

                            if ((
                            $link mysql_connect(self::$connection_info['host'], self::$connection_info['user'], self::$connection_info['pass'])) && mysql_select_db(self::$connection_info['db'], $link))
                            {
                                  
                            self::$link $link;
                                  
                            mysql_set_charset('utf8');

                            }
                              else
                            {
                                  throw new 
                            Exception('Could not connect to MySQL database.');

                            }


                            }

                              return 
                            self::$link;

                            wüsste nicht was falsch ist. Der Code startet bei 61

                            Kommentar


                            • #15
                              Welche PHP-Version?
                              Competence-Center -> Enjoy the Informatrix
                              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                              Kommentar

                              Lädt...
                              X