Ankündigung

Einklappen
Keine Ankündigung bisher.

Vererbung? oder doch SIchtbarkeit? OOP

Einklappen

Neue Werbung 2019

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

  • Vererbung? oder doch SIchtbarkeit? OOP

    Hallo, ich habe ein Problem, was ich nicht genau beschreiben kann, da mir einige Begrifflichkeiten fehlen. Deswegen zeige ich mein Problem anhand eines Beispiels.
    Dazu mache ich 4 PHP Dateien.
    -index.php
    -main.php
    -database.php
    -controller.php

    Mein Ziel ist es, aus der Klasse controller auf die Klassen Variable Test von database zuzugreifen.

    Zum Quellcode: (vereinfacht dargestellt, für die Übersicht)

    index.php:

    PHP-Code:
    include 'main.php';
    $main= new main(); 
    Die Index PHP ruft nur die main.php auf und startet die Klasse main.
    main.php

    PHP-Code:
    class main  {

     public 
    $db;

        function 
    __construct() {
            include 
    'database.php';
            
    $this->db = new database();
            include 
    'controller.php';
            
    $controller = new controller();
        }


    die Klasse Main hat die Variable $db wo dann die Klasse database reingeschrieben wird. dann ruft sie noch den Controller auf.

    database.php

    PHP-Code:

    class database  {

        public 
    $test 'Hallo ich komme aus der Datenbank';
        public function 
    __construct() {

        }


    Die Klasse Database hat nur die Variable $test. auf die soll später aus dem Controller zugegriffen werden.

    controller.php

    PHP-Code:
    class controller extends main {

        function 
    __construct() {
            echo 
    $this->db->test;
        }


    Und hier sind wir schon in der Klasse controller. Leider gibt er eine Fehlermeldung aus, wenn ich das starte
    Notice: Trying to get property 'test' of non-object in C:\xampp\htdocs\zip\controller.php on line 7
    Wie schaffe ich es nun auf die Variable aus der Datenbankklasse zuzugreifen?


    Gruß Sattelpunkt

  • #2
    bau dir mal nen classloader statt der includes. erbe einfach dinge die allgemein von mehreren klassen benutz werden. ansonsten reichen instanzen oder dependencies.
    Im übrigem instanzierst du wo du die objekte brauchst, selten davor, sonst verbaust du die sämtliche wege. variablen sind idr privat in der klasse werden üblicher weise über öffentliche getter- und setter-methoden angesteuert.

    außerdem ist deine vererbung falsch, wenn du da die gezeigte variable sehen willst. du hast in main eine instanz von db, erbst aber von cube. zudem ist der aufbau komplett falschrum.

    lern erstmal oop-grundstrukturen und teste z.b. auf repl.it und lies dir mal die Grundkonzepze von oop durch.





    bitcoin.de <- Meine Freelancerwährung

    Kommentar


    • #3
      Das mit Cube ist ein kleiner Übertragungsfehler . Main ist gemeint. (änder das gleich mal) werde mich da gleich mal einarbeiten

      Kommentar


      • #4
        Zitat von Sattelpunkt Beitrag anzeigen
        Das mit Cube ist ein kleiner Übertragungsfehler . Main ist gemeint. (änder das gleich mal) werde mich da gleich mal einarbeiten
        Das wird nix nützen, da dein controller db nicht kennt. erzeug das db-objekt doch einfach da wo du es brauchst.
        bitcoin.de <- Meine Freelancerwährung

        Kommentar


        • #5
          Zitat von Alpha Beitrag anzeigen
          bau dir mal nen classloader statt der includes. erbe einfach dinge die allgemein von mehreren klassen benutz werden. ansonsten reichen instanzen oder dependencies.
          Im übrigem instanzierst du wo du die objekte brauchst, selten davor, sonst verbaust du die sämtliche wege. variablen sind idr privat in der klasse werden üblicher weise über öffentliche getter- und setter-methoden angesteuert.

          außerdem ist deine vererbung falsch, wenn du da die gezeigte variable sehen willst. du hast in main eine instanz von db, erbst aber von cube. zudem ist der aufbau komplett falschrum.

          lern erstmal oop-grundstrukturen und teste z.b. auf repl.it und lies dir mal die Grundkonzepze von oop durch.
          Vererbung wird nicht genutzt wenn Dinge von mehreren Klassen genutzt werden, sondern wenn eine man Spezialisierung einer Basisklasse hat.
          Und instanziert wird auch nicht da wo du die Objekte brauchst, sondern da wo die Objekte instanziert werden können und es sinnvoll ist.

          Sattelpunkt

          Du kannst auf $test nicht zugreifen weil du den Konstruktor der Basisklasse "Main" in der abgeleiteten Klasse "Controller" überschreibst. Unter C++ würde das gehen, nicht aber in PHP.
          Wie schon angemerkt wurde ist deine Vererbungshierarchie falsch. Controller wäre eine (Abstrakte) Basisklasse und die Main Klasse steht für sich. Die Datenbankinstanz erzeugst du wenn dann in der Main Klasse und übergibst diese den entsprechenden Controllern über Constructor oder Setter Injection.
          "Software is like Sex, it's best if it's free." - Linus Torvalds

          Kommentar


          • #6
            Du überschreibst in deinem Controller den Constructor der Elternklasse (main). Daher ist $this->db null.
            Und man instanziiert nicht die abgeleitete Klasse im Constructor der Elternklasse.
            Stattdessen würdest du in der index.php wohl eher direkt die Controller Klasse instanziieren:

            index.php
            PHP-Code:
            require_once 'controller.php';
            $controller= new controller();
            $controller->write(); 
            main.php
            PHP-Code:
            require_once 'database.php';
            class 
            main  {

              public 
            $db;

                function 
            __construct()
                {
                    
            $this->db = new database();
                }


            controller.php
            PHP-Code:
            require_once 'main.php';
            class 
            controller extends main {

              public function 
            write()
              {
                echo 
            $this->db->test;
              }


            sorry, shift-taste kaputt

            Kommentar


            • #7
              Nope:
              PHP-Code:
              function __construct()
                  {
                      
              $this->db = new database();
                  } 
              Yep:
              PHP-Code:
              function __construct($db)
                  {
                      
              $this->db $db;
                  } 
              Abhängigkeiten sollten von aussen kommen.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar

              Lädt...
              X