Ergebnis 1 bis 7 von 7

Thema: Php5 - Oop

  1. #1

    Php5 - Oop

    Zitat Zitat
    (00:28:40) Dan: ich habe hier 2 klassen (von der Idee her): Datenbank und Ausführung (DB und Exec). Wenn mit der Datenbank keine Verbindung zum Datenbankserver möglich ist, soll die Datenbank-Klasse eine Methode von Exec aufrufen, welche überprüft, ob der Datenbankserver offline ist und bei diesen bei Bedarf startet (sofern er online ist: Nichts tun und Skript mit einer Fehlermeldung abbrechen).

    Soll ich nun eine neue Exec-Instanz innerhalb der DB-Klasse erzeugen, eine Exec-Instanz globalisieren oder die benötigten Methoden von Exec in die Datenbankklasse hinzufügen (was imho die schlechteste Lösung sein sollte)?

    (00:30:01) Thomas: mach das was am wenigsten aufwand is, das wo mit du mit wartungsaufwand am meisten verdienen kannst und das was am hirnlosesten is
    (00:30:05) Thomas: dann bewirbt dich bei M$
    Ich bin Dan, und mein Problem steht im Zitat. ;-)

    Desweiteren sind Abwandlungen des Problems möglich:
    Klasse User, Methode Add: Für diese Methode wird eine Datenbankverbindung benötigt. Die Daten, die in die Datenbank eingetragen werden, werden nicht direkt als Query weitergegeben. Meine Idee diesbezüglich: $DB->insert($table,$fields_array);

    Später soll das Objekt hinter $DB austauschbar und vererbt werden, damit z.B. pgsql genutzt werden könnte oder Features implementiert werden könnten, die vielleicht nicht jede Datenbank nutzen kann (z.B. ein PHP-Nachbau der MySQL Views, für ältere MySQL-Versionen => $DB->view(...)).

    Vielleicht gehe ich die Sache auf falsch an.
    Ich bin gespannt auf Eure Antworten.

  2. #2
    Ich würde das genau so wie Thomas sehen, ehrlich gesagt. Ich selbst würde vermutlich die Exec-Instanz globalisieren, da alles andere irgendwie etwas schmutzig ist. Teile der Exec-Klasse in die DB-Klasse zu legen, ist natürlich sinnvoll... wenn es Sinn macht. (grandiose Bedingung >_<)
    Wenn allerdings die Methode in die Exec Klasse gehört, sollte sie da auch bleiben. Das letzte, was ich wollen würde, wäre eine zweite Instanz der Exec Klasse im Scope der DB-Methode, weil das doppelter Speicherverbrauch wäre und die Instanzvariablen unterschiedliche Werte haben könnten (was natürlich u.U. nichts macht, wenn du eh keine verwendest).

    Aber ich bin ein OOP-Noob, warte lieber noch, bis jemand Kompetenteres antwortet.

    PS: Noch ein Grund für die Globalisierung: Was willst du denn machen, wenn du aus einer Funktion heraus die DB ansteuern möchtest? Da würdest du vermutlich gar nicht drüber nachdenken und entweder $GLOBALS['DB'] oder global $DB benutzen, oder?

  3. #3
    Mhhh.. wie wärs wenn du der Datenbankklasse die Methoden und Eigenschaften der Exec Klasse eifnach vererbst?

    Dann hast du zwei einzeln zu benutzende Klassen, die du leicht waten kannst, Hast aber trotzdem vollen Zugriff über die eine Klasse.
    So würde ich das angehen, solang PHP5 Vererbung unterstützt.^^

  4. #4
    Logisch unterstützt PHP5 Vererbung, das hat das noch grausamere Classen-Konstrukt in PHP4 schon getan.

    Bei PHP5 würde ich anstatt das Objekt mit global zu globalisieren, mit statischen Methoden arbeiten.
    PHP-Code:
    DB::insert('my_table', Array(
       
    'field' => 'value',
    )); 
    ist imo schöner, als:
    PHP-Code:
    global $DB;
    $DB->insert('my_table', Array(
       
    'field' => 'value',
    )); 
    in jeder Funktion .

    Damit die Classe immer gleich heißen, kann müsstest du logischer weise jede Version in eine eigene Datei auslagern.
    Andere Möglichkeit währe, mit einer sogenannten singleton Classe/Function zu arbeiten:
    PHP-Code:
    singleton('DB')->insert('my_table', Array(
       
    'field' => 'value',
    )); 
    mfG

  5. #5
    Zitat Zitat von dead_orc Beitrag anzeigen
    Noch ein Grund für die Globalisierung: Was willst du denn machen, wenn du aus einer Funktion heraus die DB ansteuern möchtest? Da würdest du vermutlich gar nicht drüber nachdenken und entweder $GLOBALS['DB'] oder global $DB benutzen, oder?
    Das wäre zum Beispiel so ein Problemfall. Ich könnte beispielsweiße die DB als Singleton nutzen, was ich aber nicht möchte, das ich gerne $this verwenden möchte.

    Hier gehe ich gleich näher drauf ein.

    Zitat Zitat von makkurona Beitrag anzeigen
    Mhhh.. wie wärs wenn du der Datenbankklasse die Methoden und Eigenschaften der Exec Klasse eifnach vererbst?
    Die Idee ist gar nicht so schlecht, aber für mich erscheint das nicht gerade als saubere Lösung. Desweiteren sind dann Methoden doppelt in Benutzung und das würde ich gerne vermeiden.

    Zitat Zitat von Xardas der Dunkle Beitrag anzeigen
    Damit die Classe immer gleich heißen, kann müsstest du logischer weise jede Version in eine eigene Datei auslagern.
    Andere Möglichkeit währe, mit einer sogenannten singleton Classe/Function zu arbeiten:
    PHP-Code:
    singleton('DB')->insert('my_table', Array(
       
    'field' => 'value',
    )); 
    mfG
    Bei Singletons fehlt mir leider die $this Möglichkeit. Einige weniger restrikte Singletons kann man zwar zur Arbeit mit $this zwingen, aber genauer betrachtet erzeugt man dann eine normale Klasse und wenn es dumm läuft, erhält man in der zweiten Funktion, die ein $this verwendet und eine Klasse erzeugen möchte eine Fehlermeldung.

    Hier noch ein Beispiel:
    PHP-Code:
      /**
       * @brief   counts entries limited to restrictions
       * @see     $this->count_restriction
       * @version 0
       *
       * @param $table
       *   sets the table where to count the entries
       * @param $reset_restrictions
       *   deletes restrictions after processing
       * @return
       *   return counted entries
       */
      
    public function count ($table,$reset_restrictions=true) {
        
    // Ausgabe überprüft ob Einschränkungen in $this->restrictions gespeichert wurden
      
    }

      
    /**
       * @brief   sets the restrictions for $this->count()
       * @see     $this->count
       *
        * @param $key
       *   key of the column
       * @param $operator
       *   operator to deal with
       * @param $value
       *   value to deal with
       * @return
       *   true by default
       */
      
    public function count_restriction ($key,$operator,$value) {
        
    // Fügt Einschränkungen in $this->restrictions
      

    Ich versuche mich von der umständlichen Arraybildung zu trennen und sehe darin den Vorteil der OOP. In diesem Beispiel würde ich z.B. die Anzahl aller `Bewohner` der Stadt `Musterhausen` mit dem Nachnamen `Mustermann` zählen lassen:
    PHP-Code:
    $DB->count_restriction('Stadt','=','Musterhausen');
    $DB->count_restriction('Nachname','=','Mustermann');
    echo 
    $DB->count('Bewohner'); 
    Das könnte man auch mit nur einer Funktion lösen, beispielsweise:
    PHP-Code:
    /**
    * ...

    * @param $table
    *   sets the table where to count the entries
    * @restrictions_array
    *   optional array, sets restrictions
    * @return
    *  return counted entries
    */
    function _count ($table,$restrictions_array=array()) {
    }

    // Beispiel
    $array = array(
      array(
    'Stadt','=','Musterhausen'),
      array(
    'Nachname','=','Mustermann')
    );

    echo 
    _count('Bewohner',$array); 

  6. #6
    Zitat Zitat
    Bei Singletons fehlt mir leider die $this Möglichkeit.
    ???, was zu ein Blödsinn. Du verwechselts statische Methoden mit singleton ...
    Beispiel:
    PHP-Code:
    <?php

    class {
        public 
    $var 'foo';

        public function 
    getVar() {
             return 
    $this->var;
        }
    }

    class 
    {
        public 
    $var 'bar';

        public function 
    getVar() {
             return 
    $this->var;
        }
    }

    function 
    singleton($className) {
        static 
    $_instances;
        if(!isset(
    $_instances[$className])) {
             
    $_instances[$className] = new $className;
        }
        return 
    $_instances[$className];
    }

    echo 
    singleton('A')->getVar(), "<br />\n"// Gibt: foo<br />\n aus
    echo singleton('B')->getVar(), "<br />\n"// Gibt: bar<br />\n aus
    mfG

    http://de3.php.net/manual/de/languag...erns.singleton
    http://de3.php.net/manual/de/language.oop5.static.php

    Geändert von Xardas der Dunkle (31.05.2008 um 15:13 Uhr)

  7. #7
    Das ist ja toll. Danke! :-)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •