Ankündigung

Einklappen
Keine Ankündigung bisher.

Vererbung von Klassen

Einklappen

Neue Werbung 2019

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

  • Vererbung von Klassen

    Hallo Forummer
    Ich habe einige Klassen erstellt, die auch super funktionieren. Jetzt stört es mich, dass ich identischen Code mehrfach verwende. Ich hab nun versucht die Klassen auseinander zu nehmen, so dass code der vielfach identisch ist in einer Elternklasse steht und den Kindern vererbt wird. Wie im richtigen Leben gibt das erben ärger.

    Das wäre meine Elternklasse mit hauptsach __constructor, __destructor, getSQL, load, delete, save, add
    Code:
    <?php
    class basictab
    {
    
        //Constructor der Klasse
        function __construct()
            {
                $this->objDB = GetMyConnection();
            }
    
        //Destructor der Klasse
        function __destruct()
            {
            }
    
        //SQL zurückgeben
        public function getSQL()
            {
                return $this->ds_sql;
            }
    
        //Eigenschaften Laden
        public function load()
            {
                $this->ds_array = $this->ds->fetch_assoc();
                foreach ($this->ds_array as $key => $value)
                    {
                        $this->{"cs_".$key} = $value;
                    }
            }
        //Datensatz Löschen
        public function delete($del_array)
            {
                $_SESSION['String'] = "del:< br>";
                $adID = $del_array[self::id_Index];
                //SQL zum löschen der Adresse zusammenstellen
                if ($adID != 0)
                    {
                        $this->sql ="DELETE FROM ".self::TABLE_NAME." WHERE ".self::TABLE_NAME.".".self::id_Index." = ".$adID;
                        $_SESSION['saveSQL'] = $this->sql;
                        fktTestSQL($this->sql, $this->objDB);
                    }
            }
    
        //Datensatz Speichern
        public function save($save_array, $Start_adr_Array="")
            {
                $adID = 0;
                $sqlup = "";
                $this->sql = "UPDATE ".self::TABLE_NAME." SET ";
    
               //Kontrollvariablen
                $sessCount=0;
                $_SESSION['String'] = "save:< br>";
                $_SESSION['info'] = "";
                $_SESSION['ifvergleich'] = "";
                $_SESSION['saveSQL'] = "";
                $_SESSION['benutzerForm']=$kunden_array;
    
                foreach ($save_array as $kuvar => $value)
                    {
                        $_SESSION['ifvergleich'] .=$sessCount++." ". $value." != ".$this->{"cs_".$kuvar}." and ".$kuvar." != \"id\"";
    
                        if (($value != $this->{"cs_".$kuvar}) and ($kuvar != "id"))
                            {
                                //Daten wurden verglichen und ein Speichern ist notwendig
                                //Jetzt wird via set-function festgestellt wie die Daten gespeichert
                                //werden soll.
                                $this->{"set_cs_".$kuvar}($value);
                                $_SESSION['info'] .="Set ".$kuvar.": ".$value.";< br>";
                                $_SESSION['String'] .= $this->{"cs_".$kuvar};
                                if(is_numeric($this->{"cs_".$kuvar}))
                                    {
                                        $_SESSION['String'] .= "=nein< br>";
                                        $sqlup .= self::TABLE_NAME.".".$kuvar."=".$this->{"cs_".$kuvar}.", ";
                                    }
                                else
                                    {
                                        $_SESSION['String'] .= "=ja< br>";
                                        if ($this->{"cs_".$kuvar} != NULL)
                                            {
                                                $sqlup .= self::TABLE_NAME.".".$kuvar." = '".$this->{"cs_".$kuvar}."', ";
                                                $_SESSION['String'] .= $sqlup."< br>";
                                            }
                                        else
                                            {
                                                $sqlup .= self::TABLE_NAME.".".$kuvar." = NULL, ";
                                                $_SESSION['String'] .= $sqlup."< br>";
                                            }
                                    }
                            }
                        else
                            {
                                if ($kuvar == self::id_Index)
                                    {
                                        $adID = $value;
                                        $_SESSION['String'] .= "\ mit wert:".$value."< br>";
                                    }
                            }
                   }
    
                $_SESSION['String'] .= "adID: ".$adID."< br>";
                if ($adID != 0)
                    {
                        $_SESSION['String'] .= "SQL-Länge: ".strlen($sqlup)."< br>";
                        if (strlen($sqlup)!=0)
                            {
                                $_SESSION['String'] .= "vor dem endgültigen erstellen des SQL: ".$sqlup."< br>";
                                $sqlup = substr ($sqlup,0,strlen($sqlup)-2);
                                $this->sql .= $sqlup." WHERE ".self::TABLE_NAME.".".self::id_Index."=".$adID;
                                $_SESSION['saveSQL'] = $this->sql;
                                fktTestSQL($this->sql, $this->objDB);
                                return $this->objDB->insert_id;
                            }
                    }
                else
                    {
                        return "Update nicht möglich!";
                    }
            }
    
        //Datensatz NEU
        public function add($add_array)
            {
                $_SESSION['String'] = "add:< br>";
                $this->sql = "INSERT INTO ".self::TABLE_NAME." ";
                $tabFeld = "(";
                $tabFeldValues = " Values (";
                foreach ($add_array as $kuvar => $value)
                    {
                    //Alle Eigenschaften ausser den Index zusammenstellen
                        if ($kuvar != self::id_Index)
                            {
                                //Feldliste für SQL erstellen
                                $tabFeld .= "`".$kuvar."`, ";
                                //Eingaben aus Formular mit entsprechender Set-Funktion für die Eigenschaft bereinigen
                                $this->{"set_cs_".$kuvar}($value);
                                //Liste der Werte für SQL Values erstellen
                                if (is_numeric($this->{"cs_".$kuvar}))
                                    {
                                        $tabFeldValues .= $this->{"cs_".$kuvar}.", ";
                                    }
                                else
                                    {
                                        $tabFeldValues .= "'".$this->{"cs_".$kuvar}."', ";
                                    }
                            }
                    }
                //überzähliges , abschneiden und abschliessende Klammer setzen bei Feldnamen und Werten
                $tabFeld = substr($tabFeld,0,strlen($tabFeld)-2).") ";
                $tabFeldValues = substr($tabFeldValues,0,strlen($tabFeldValues)-2).")";
                //SQL fertig zusammenstellen
                $this->sql .= $tabFeld.$tabFeldValues;
                //SQL ausführen
                $_SESSION['saveSQL'] = $this->sql;
                fktTestSQL($this->sql, $this->objDB);
                return $this->objDB->insert_id;
            }
    
    }
    ?>
    Kindklasse! Dabei bekomme ich den Fehler, dass die Funktion der Elternkalsse getSQL nicht auf die private Variable $ds_sql

    Code:
    <?php
    require ($_SESSION['startverz'] . '/class/class_basictab.php');
    
    class tadressen_erb extends basictab
    {
       //Konstanten definieren
       const TABLE_NAME = "TAdressen";
       const id_Index = "Ad_id";
    
    
       //Interne Klasseneigenschaften erstellen
       private $ds;
       private $ds_sql;
       private $ds_array;
    
       //Eigenschaften auf grund der Tabelle erstellen:
       private $cs_Ad_id;
       private $cs_HauptId;
       private $cs_Geschlecht;
       private $cs_Vorname;
       private $cs_Nachname;
       private $cs_Titel;
       private $cs_Firmenname;
       private $cs_Adresse;
       private $cs_Ort;
       private $cs_Postleitzahl;
       private $cs_Land;
       private $cs_Foto;
       private $cs_Frei1;
       private $cs_Frei2;
       private $cs_KundeJaNein;
       private $cs_HatNebenAdr;
       private $cs_Anschrift;
       private $cs_Intern;
       private $cs_Absender;
       private $cs_Sperrung;
       private $cs_Gruppe;
       private $cs_IMPDate;
       private $cs_Postfach;
       private $cs_QuikSuche;
       private $cs_Frei3;
       private $cs_Frei4;
       private $cs_OLGeaendert;
       private $cs_ACCGeaendert;
       private $cs_OLEntryID;
       private $cs_warn;
       private $cs_Provision;
    
    
       //Aus SQL Recordset zurück geben
       function getSQL_Rec()
        {
            return fktTestSQL($this->ds_sql, $this->objDB);
        }
    
       //Einzelner Datensatz holen
       public function getTAdressen_1($id)
            {
                $this->ds_sql = "SELECT * FROM ".self::TABLE_NAME." WHERE ".self::id_Index." = ".$id;
                $this->ds = fktTestSQL($this->ds_sql, $this->objDB);
                $this->load();
            }
    
       //Auswahl Datensätze holen
       public function getTAdressenWhere($strWhere="")
            {
                $this->ds_sql = "SELECT * FROM ".self::TABLE_NAME;
                    if ($strWhere !== "")
                    {
                        $this->ds_sql .= " WHERE ";
                        $this->ds_sql .= $strWhere;
                    }
            }
    
       //Alle Datensätze holen
       public function getTAdressen()
            {
                $this->ds_sql = "SELECT * FROM ".self::TABLE_NAME;
                return fktTestSQL($this->ds_sql, $this->objDB);
            }
    
       //Alle Datensätze holen
       public function getTAdressenWhereNNVN($strWhere="")
            {
                $this->ds_sql = "SELECT Ad_id, CONCAT(Nachname, \" \", Vorname, \"\, \", Ort) AS NNVN FROM ".self::TABLE_NAME;
                    if ($strWhere !== "")
                    {
                        $this->ds_sql .= " WHERE ";
                        $this->ds_sql .= $strWhere;
                    }
            }
    
       //Get und Set Functionen erstellen
       function set_cs_Ad_id($value)
            {
                $this->cs_Ad_id = $this->objDB->real_escape_string($value);
            }
       function get_cs_Ad_id()
            {
                return $this->cs_Ad_id;
            }
       function set_cs_HauptId($value)
            {
                $this->cs_HauptId = $this->objDB->real_escape_string($value);
            }
       function get_cs_HauptId()
            {
                return $this->cs_HauptId;
            }
       function set_cs_Geschlecht($value)
            {
                $this->cs_Geschlecht = $this->objDB->real_escape_string($value);
            }
       function get_cs_Geschlecht()
            {
                return $this->cs_Geschlecht;
            }
      ...
    }
    ?>
    Danke für hinweise.

  • #2
    Zitat von Marlon Beitrag anzeigen
    Jetzt stört es mich, dass ich identischen Code mehrfach verwende.
    Habe jetzt deinen Code nicht tiefgründig angeschaut. Um Code in Klassen wiederzuverwenden, schau dir mal Traits an ob dies für dein Problem nicht besser geeignet ist.
    Auf private kannst du nur innerhalb der Klasse zugreifen, was du brauchst ist protected.

    Kommentar


    • #3
      Deine Klasse macht zu viel. Sie enthält einerseits die Properties, macht aber auch Datenkabfragen. Eine Klasse sollte nur für eine Aufgabe zuständig sein.

      Und direkte Zugriffe auf die Session sollten auch nicht aus einer Klasse heraus gemacht werden.

      SELECT * ist übrigens böse und sollte nicht verwendet werden.

      Kommentar


      • #4
        tadressen_erb extends basictab
        Kurze Anmerkung noch zur Vererbung. Vererbung ist immer ein "ist ein/e" Beziehung. Dh. BMW ist ein Auto, Mann ist ein Mensch etc.
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          PHP-Code:
            require ($_SESSION['startverz'] . '/class/class_basictab.php'); 
          dein startverzeichniss lässt Du dir über session mitteilen ?

          Dein Object basictab macht doch - ausgenommen von dem session gedöns - nur db afrage.
          Eine zusätzliche classe, welche auch eine db abfragen realisiert, ebrt nicht von der grundlegenden db classe, sondern nutzt diese.


          Kommentar


          • #6
            Besten Dank für eure Antworten. ich schaue mir mal Traits an um zu entscheiden ob das für mein problem das richtige ist.

            Danke nochmals für eure Zeit

            Kommentar

            Lädt...
            X