Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Klassenstruktur für Adressdatenbank (https://www.delphipraxis.net/166235-%5Bphp%5D-klassenstruktur-fuer-adressdatenbank.html)

Luckie 8. Feb 2012 18:53

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Zitat:

Zitat von Valle (Beitrag 1149968)
class Contact extends DB_Exception? Ich denke das war nicht beabsichtigt, oder?

Eigentlich schon. Oder wie kann ich sonst eigene, spezifische Exceptions werfen?

Zitat:

Die Kontakte-Klasse sollte die Verbindung zu MySQL nicht selbst aufbauen.
Na ja, Ich wollte es erst nur mit einer Klasse mache, deswegen der Verbindungsaufbau an dieser Stelle. Wo wäre es denn günstiger?

Zitat:

Man schließt die MySQL-Verbindung auch nicht im Destruktor dieser Klasse, sondern am Ende des Programms.
Hm. Es ist also ungünstig jedes mal wieder eine Verbindung aufzubauen und zu trennen?

Zitat:

Es empfiehlt sich auch eine abstrakte Bibliothek zu verwenden (PDO)
Habe ich mit Absicht vermieden.

Zitat:

Statt all die Felder zu kopieren, solltest du Getter und Setter verwenden.
Ich war erst mal zu faul die Getter und Setter zu schreiben. Leider hab eich keine IDE welche sie automatisch aus den privaten Feldern erzeugt.

Zitat:

Dein MVC ist nicht wirklich eins. Dein View übernimmt Exception-Handling und weiß zu viel vom Model. Einen Controller hast du nicht wirklich, bzw. mischst ihn mit dem eigentlichen View (HTML-Code).
Sollte es auch gar nicht sein.

Zitat:

Mach deine Klassen kleiner und dümmer, dafür aber mehr davon. :-)
Mal schauen, ob ich das hinbekomme.

Danke für die Tipps und Anregungen.

Valle 8. Feb 2012 19:56

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Zitat von Valle (Beitrag 1149968)
class Contact extends DB_Exception? Ich denke das war nicht beabsichtigt, oder?

Eigentlich schon. Oder wie kann ich sonst eigene, spezifische Exceptions werfen?

Dein Kontakt ist doch keine Exception, sondern eine Tabelle, bzw eine Zeile dieser. Du wirfst ja keinen Kontakt im Fehlerfall, sondern eine extra angelegte Exception. Normalerweise hat man Exceptions wie QueryFailed oder EmptyResult oder sowas. Diese werden von der Vaterklasse des Kontaktes geworfen und jeweils als eigene Klasse implementiert, denn sowas braucht man bei jeder Klasse. Man hat dann für jede Klasse, und wenn sie noch so klein ist, eine eigene Datei. Ich schlage eine DB_Exception Klasse vor (erbt von Exception) und dann die genannten EmptyResult usw. Exceptions, welche von der DB_Exception erben. getById (oder einfach get) sollte auch nicht vom Kontakt selbst implementiert sein, denn eine ID sollte jede Tabelle haben. (m:n zählt nicht)

Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Die Kontakte-Klasse sollte die Verbindung zu MySQL nicht selbst aufbauen.
Na ja, Ich wollte es erst nur mit einer Klasse mache, deswegen der Verbindungsaufbau an dieser Stelle. Wo wäre es denn günstiger?

MySQL-Verbindungen speichere ich immer in einer Registry. Diese ist ein Singleton und stellt eigentlich nur ein assoziatives Array dar. Es gibt also nur eine Registry im Programm.
Man holt sich also die Registry Instanz (siehe Singleton Artikel auf Wikipedia unter PHP), verbindet sich im "Bootloader" mit MySQL und speichert die Connection in diese Registry. Die Db_Table Klasse, von der der Kontakt erben sollte, beschafft sich im Konstruktor diese Verbindung, speichert sie in ein Feld und man arbeitet in der Kontakt-Klasse dann einfach mit $this->db.

Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Man schließt die MySQL-Verbindung auch nicht im Destruktor dieser Klasse, sondern am Ende des Programms.
Hm. Es ist also ungünstig jedes mal wieder eine Verbindung aufzubauen und zu trennen?

Ja natürlich! Was hast du denn gedacht? Für jeden Query Verbindung neu aufbauen und wieder beenden? Eine Verbindung pro Seitenaufruf reicht völlig aus. Es gibt Leute, die gehen dazu über persistente Verbindungen aufzubauen. Diese bauen einmal eine Verbindung auf, welche dann bis zum nächsten Neustart des Webserver aufrecht erhalten bleibt.

Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Es empfiehlt sich auch eine abstrakte Bibliothek zu verwenden (PDO)
Habe ich mit Absicht vermieden.

Schade, warum? Du weißt dass du SQL-Injections riskierst?

Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Statt all die Felder zu kopieren, solltest du Getter und Setter verwenden.
Ich war erst mal zu faul die Getter und Setter zu schreiben. Leider hab eich keine IDE welche sie automatisch aus den privaten Feldern erzeugt.

Das hast du nicht richtig verstanden. Du machst dein Query und holst die Daten des Kontakts. Diese speicherst du als assoziatives Array oder Objekt in ein privates Feld, mit Namen data oder so. Dann machst du zwei Methoden __get und __set. Beispiel:
PHP-Quellcode:
 function __get($name) { return $this->data->$name; }
Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Dein MVC ist nicht wirklich eins. Dein View übernimmt Exception-Handling und weiß zu viel vom Model. Einen Controller hast du nicht wirklich, bzw. mischst ihn mit dem eigentlichen View (HTML-Code).
Sollte es auch gar nicht sein.

Schade, warum?

Zitat:

Zitat von Luckie (Beitrag 1149969)
Zitat:

Mach deine Klassen kleiner und dümmer, dafür aber mehr davon. :-)
Mal schauen, ob ich das hinbekomme.

Sicher schaffst du das. Wir helfen dir dabei! :-)

Edit:// Was ich jetzt noch gar nicht bemerkt habe! Du hast alle Methoden nicht-statisch gemacht. Das ist nicht ganz so wie es sein sollte. Stell dir vor, dass die Klasse die Tabelle repräsentiert. Eine Instanz der Klasse repräsentiert eine einzige Zeile dieser Tabelle. Möchtest du also einen speziellen Kontakt, rufst du die statische Methode get($id) der Klasse auf. Diese erzeugt eine Instanz ihrer selbst und gibt sie zurück. Weißt du wie ich das meine?

Liebe Grüße,
Valentin

Namenloser 8. Feb 2012 20:16

AW: [PHP] Klassenstruktur für Adressdatenbank
 
[OT]
Zitat:

Zitat von Valle (Beitrag 1149398)
Zitat:

Zitat von Luckie (Beitrag 1149393)
Klingt gut. auch wenn ich es selber bastele, werde ich mir das angucken.

Andersrum wäre schlauer, erst gucken, dann machen. Aber sonst gute Idee. :)

Kommt glaube ich darauf an, was für ein Typ man ist. Manche lernen besser, indem sie Code von anderen studieren, andere lernen besser, indem sie selbst welchen schreiben/versuchen etwas nachzubauen. Ich gehöre selbst zur zweiten Gruppe. Oft wird einem nämlich erst dann klar, warum bestimmte Dinge bei anderen Frameworks/Libs/Was-auch-immer auf eine bestimmte Weise gelöst wurden. Ich hatte auf diese Weise jedenfalls schon einige Aha-Erlebnisse.
[/OT]

Valle 8. Feb 2012 20:24

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab hier mal ein kleines UML Diagramm skizziert.

Kursive Klassen sind abstrakt, unterstrichene Methoden sind statisch.

Ich garantiere keine Korrektheit oder Vollständigkeit, aber es sollte ungefähr zeigen wie ich mir das vorstelle. :)

Liebe Grüße,
Valentin

Luckie 9. Feb 2012 14:31

AW: [PHP] Klassenstruktur für Adressdatenbank
 
@Valle: Danke, dass du dir da so deinen Kopf zerbrochen hast. Ich werde es versuchen nach und nach umzusetzen. Ich habe mir mal zwei Sachen rausgepickt als nächsten Milestone:

1. Das mit den Exceptions.
2. Auslagern des Verbindunsgaufbaus.

Für beides bräuchte ich aber zum Angucken und nachbauen etwas Beispielcode.

Luckie 9. Feb 2012 15:47

AW: [PHP] Klassenstruktur für Adressdatenbank
 
So, meine Exceptionklasse sieht jetzt erst mal so aus:
Code:
<?php
   class DBException extends Exception
   {
      public function __construct($message, $code = 0) {
         parent::__construct($message, $code);
      }
   }
   
   class DBEXception_QueryFailed extends DBException{
      public function __construct($message, $code = 0) {
         parent::__construct($message, $code);
      }
   }
   
   class DBEXception_EmptyResult extends DBException{
      public function __construct($message, $code = 0) {
         parent::__construct($message, $code);
      }
   }
?>
Ich habe gelesen, dass man den Konstruktor auf alle Fälle überschreiben und dort den Parent-Konstruktor aufrufen soll. Ich denke mal, so hast du dir das vorgestellt.

Valle 9. Feb 2012 19:21

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Zitat:

Zitat von Luckie (Beitrag 1150154)
Ich habe gelesen, dass man den Konstruktor auf alle Fälle überschreiben und dort den Parent-Konstruktor aufrufen soll.

So'n Quatsch. Lass das mal. o0 (Oder mach's von mir aus ein Mal in der Vaterklasse, aber nicht jedes mal)

Btw, PHP-Klammer bei PHP-Code bitte weglassen, dann funktioniert das Highlighting. :)

PHP-Quellcode:
class DBEXception_QueryFailed extends DBException
{}
Und nochmal btw, du brauchst nach der PHP-Klammer nicht einrücken. Damit sparst du wertvollen Platz nach rechts. Und das Einrücken nach der Klammer ist wirklich sinnlos. (Du rückst in Delphi ja auch nicht nach program oder unit ein. (Oder wie auch immer das da oben heißt^^)

Zitat:

Zitat von Luckie (Beitrag 1150154)
Ich denke mal, so hast du dir das vorgestellt.

Perfekt. :)

Und hier mal eine einfache und ungetestete Implementation der Registry:

PHP-Quellcode:
// Registry.php

final class Registry
{
 
    private static $instance = NULL;
    private $data = array();

    private function __construct() {}
    private function __clone() {}
 
    public static function getInstance() {
 
        if (NULL === self::$instance) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function get($id)
    {
        return $this->data[$id];
    }

    public function __get($id)
    {
        return $this->get($id);
    }

    public function set($id, $value)
    {
        $this->data[$id] = $value;
    }

    public function __set($id, $value)
    {
        return $this->set($id, $value);
    }

    // TODO throw exception on missing index
    // TODO unset, __unset, isset, __isset

}
 
// Bootloader.php

abstract class Bootloader
{

    private static function connect_mysql()
    {

        $registry = Registry::getInstance();
        $registry->db = new mysqli('127.0.0.1', '', '', 'mysql');

        if (mysqli_connect_error()) {
            die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
        }

        printf("Connected to %s\n", $registry->db->host_info);
    }

    public static function boot()
    {
        register_shutdown_function("Bootloader::shutdown");
        self::connect_mysql();
    }

    public static function shutdown()
    {
        Registry::getInstance()->db->close();
        printf("Connection closed.\n");
    }

}

// index.php

Bootloader::boot();

// IrgendeinModel.php

class Model
{

    public function __construct()
    {
        $this->db = Registry::getInstance()->get('db');
        echo $this->db->query('SELECT NOW() AS `now`')->fetch_object()->now . "\n";
    }

}

new Model();
Liebe Grüße,
Valentin

Luckie 9. Feb 2012 20:54

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Super, das habe ich sogar verstanden. Und in der Registry kann man dann ja alles ablegen, was man zwischen speichern will.

Valle 9. Feb 2012 20:55

AW: [PHP] Klassenstruktur für Adressdatenbank
 
Richtig, dazu ist es da. :)

Liebe Grüße,
Valentin

Luckie 9. Feb 2012 20:56

AW: [PHP] Klassenstruktur für Adressdatenbank
 
OK, dann hab eich es verstanden. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr.
Seite 2 von 7     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz