php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.11.2008, 21:44  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Vielleicht meint er ja auch eine Fabrikmethode.
Ich denke aber viel eher, dass er vorhat, eine Instanz zu erzeugen und diese per Registry zu speichern.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.11.2008, 21:52  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nerere,

Zitat:
Bei mir stellt sich gerade die Frage, wie ich in meinem Projekt den Umgang mit dem Datenbank-Objekt regle. Wie sinnvoll ist es, dafür eine extra "Registry" anzulegen? Gibt es Vorteile gegenüber der Methode, die MySQL-Klasse als Singleton auszulegen?
Ich würde hier nicht mit einer Registry arbeiten, sondern - wie angesprochen - mit einer Factory. Grund: die Datenbank-Abstraktion folgt einem durchgängigen Muster. Weiterhin würde ich aus Performance-Gründen dafür sorgen, dass eine dedizierte Instanz ein Singleton ist, so muss die Verbindung zur Datenbank beispielsweise nur einmal aufgebaut werden.

Im APF ist dazu der connectionManager enthalten, der gemäß einer Konfiguration konkrete Instanzen erzeugt und verwaltet. Das hat den weiteren Vorteil, dass die gelieferten Datenbank-"Treiber" nicht nur pro Verbindung eineindeutig sind, sondern auch die Art der Datenbank noch weiter abstrahiert werden kann. Sicher nicht komplett, aber weitestgehend.

Gegen Registry spricht meiner Ansicht nach auch, dass sich die Teile deiner Software, die sich mit Datenhaltung beschäftigen darauf verlassen müssen, dass deine Registry relevante Datenbank-Zugriffsschichten enthalten. Das erfordert manualles Eingreifen in der Bootstrap-Datei und entkoppelt damit die Anwendungen wieder weniger voneinander, da du Abhängigkeiten nicht getrennt behandeln kannst sondern manuell auflösen musst. Gehst du wie im zweiten Absatz vor, kann jede Komponente / Software selbst entscheiden, welche Datenbank-Verbindung sie nutzt und es ist auf einfache Weise möglich, in den unterschiedlichen Teilen deiner Anwendung sogar ohne globale Abhängigkeiten auf unterschiedliche Datenbanken zuzugreifen.

Gestaltest du den ConnectionKey innerhalb deiner Anwendung noch konfigurierbar, so kannst du sogar pro "Einsatz" der Applikation unterschiedliche Connections nutzen. "Einsatz" meint hier, wo dein Modul eingesetzt ist.

Just my 2 cent.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 20.11.2008, 20:02  
Neuer Benutzer
 
Registriert seit: 17.11.2008
Beiträge: 8
nerere befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Zu aller erst vielen Dank für die vielen Antworten!

Ich werde nur eine einzige Datenbank-Verbindung und damit auch nur eine einzige Instanz meiner Datenbank-Verbindungsklasse brauchen. Verschiedene Treiber etc. sind eigentlich nicht nötig, da die Datenbank auf jeden Fall MySQL sein wird.

Mir ist leider noch nicht ganz klar, wie eine Factory mir bei dem Problem mit der eindeutigen (einzigen) Instanz weiterhelfen kann. Oder war diese nur darauf bezogen, dass ich damit evtl. verschiedene Treiber verwenden könnte? Eine Factory kümmert sich doch eigentlich gar nicht darum, wieviele Instanzen eines Objektes es bereits gibt.

Zitat:
Zitat von nikosch Beitrag anzeigen
Das meinte ich nicht (ginge aber auch) sondern eine Managementklasse, die Datenbanken erzeugt und zurückgibt und in einem statischen Member verwaltet.
Genau an so eine "Managementklasse" dachte ich, als ich von einer Registry sprach. Oder ist das falsch?

Um noch einmal zusammenzufassen, was mein Stand ist: Ich verstehe es so, dass es zwei Methoden gibt, um sicherzustellen, dass z.B. die Datenbankverbindung nur einmal instanziiert wird.
  1. Einmal durch die Klasse selbst: Singleton
  2. Und einmal "global" (und somit evtl. auch für andere Klassen): per Registry

Viele Grüße,
nerere
nerere ist offline   Mit Zitat antworten
Alt 20.11.2008, 20:15  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich persönlich finde es stimmiger, statt einer Registry (ja irgendwie nur ein GLOBALS Ersatz) eine DatenbankManagement-Klasse mit statischen Methode zu verwenden. Die brauchst Du nicht instanziieren und kannst trotzdem, bei Bedarf, mehrere Datenbakobjekte verwalten.

Etwas roughes Beispiel:
PHP-Code:
<?php
// erster Aufruf, ruft intern self::create () auf
$oDB DatabaseManager::get ('mysql');
$oDB->query ( ... ); // etc.

function anyfunc ()
  {
  
$oDB DatabaseManager::get ('mysql');
  ...
  }

class 
DatabaseManager
  
{
  static 
$aDatabases = array ();

  static function 
create ($key)
    {
    
$aSetting = array ('mysql' => array (
                                        
'mysql' 
                                        
'host' 
                                        
'user' 
                                        
'pass'
                                        
) ,

                       
// andere Datenbanken
                       
);

    switch (
$aSetting[$key][0])
      {
      case 
'mysql':
      default:
        
self::$aDatabases[$key] = new MysqlDatabase ($aSetting[$key][1] , ...);
        break;
      }
    
// ginge auch so:
    // $class = $aSetting[$key][0] . 'Database';
    // self::$aDatabases[$key] = new $class ($aSetting[$key][1] , ...);
    
}

  static function 
get ($key)
    {
    
// Quasi-Singleton
    
if (false === isset (self::$aDatabases[$key]))
      {
      
self::create ($key);
      }
    return (
self::$aDatabases[$key]);
    }

  }
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (20.11.2008 um 20:21 Uhr).
nikosch ist gerade online   Mit Zitat antworten
Alt 01.12.2008, 16:12  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Thema is ja noch frisch, darf ich noch dies anhängen:
Ich empfehle dir auf jeden Fall den Singleton, ob parameterisiert oder nicht. Zudem solltest du, wenn du schon "nur" mit MySQL und vor allem PHP5 arbeitest mysqli verwenden. Dabei gibt es ein kleines Problem mit dem Contructor, hier mein Code:
PHP-Code:
class DB extends mysqli
{
// [...]
    /**
     * Unique Instance of Database
     * @var DB
     */
    
private static $Instances = array();
    
/**
     * Database Contructor
     * Returns the unique Database instance
     * @return DB
     */
    
public static function getInstance($id=0)
    {
        if (
self::$Instances[$id] === NULL)
        {
            
self::$singletonacc true;
            
self::$Instances[$id] = new self();
        }
        return 
self::$Instances[$id];
    }
    protected static 
$singletonacc false# needed due to __construct problem..
    
private final function __clone() {}
    
/**
     * PROTECTED!
     */
    
public function __construct() # due to some PHP "bug" I can't declare the method protected/private
    
{
        if (!
self::$singletonacc)
        {
            throw new 
DBException('Use ::getInstance() to get the DB object!');
        }
        
$cnfg = new DBConfig();
        @
parent::__construct($cnfg->host,$cnfg->user,$cnfg->passwd,$cnfg->dbname);
        if (
mysqli_connect_error())
        {
            throw new 
DBException('Connection failed ['.mysqli_connect_errno().']:'.mysqli_connect_error());
        }
        
self::$singletonacc false;
    }
// [....]

Wie du das mit der Config machst, ist natürlich dir überlassen. Dies ist nur eine Möglichkeit. Die "Multi-"Singleton habe ich auch erst seit kurzem, weil ich etwas testen wollte. Ich könnte ihn eigentlich wieder ausbauen, weil ich ihn nicht brauche, aber so stört es ja nicht.

Geändert von Phoscur (01.12.2008 um 17:09 Uhr).
Phoscur ist offline   Mit Zitat antworten
Alt 01.12.2008, 16:56  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Die "Multi-"Singleton habe ich auch erst seit kurzem, weil ich etwas testen wollte. Ich könnte ihn eigentlich wieder ausbauen, weil ich ihn nicht brauche, aber so stört es ja nicht.
Ich denke du spielst hier eher auf eine singleton instanzierte Factory an?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geändert von dr.e. (01.12.2008 um 20:21 Uhr).
dr.e. ist offline   Mit Zitat antworten
Alt 01.12.2008, 17:06  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Nein, ich rede nur von einer Datenbankklasse auf mysqli Basis mit Singleton. Das "Multi-" habe ich dran gebaut, weil dieser Singleton mehr als eine einzige Instanz unterstützt.

Der Aufbau oben ist für die meisten Verwendungszwecke unsinnig, weil er zwar mehrere Instanzen, aber nur eine Config erlaubt. Das müsste man ändern, wenn man doch mehrere Verbindungen verwaltet. Mir ging es aber eher darum zu zeigen, wie man mysqli mit singleton verwenden kann.

Dennoch ist dies eindeutig keine Fabrik.
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 01.12.2008, 17:08  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Das "Multi-" habe ich dran gebaut, weil dieser Singleton mehr als eine einzige Instanz unterstützt.
Deswegen frage ich ja nach, denn das wiederspricht sich etwas... Dass die Implementierung nichts mit dem Factory-Pattern zu tun hat, ist auch mir klar.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geändert von dr.e. (01.12.2008 um 20:20 Uhr).
dr.e. ist offline   Mit Zitat antworten
Alt 01.12.2008, 18:38  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

@Doc: seit wann gibt es eigentlich ein Fabric-Muster? Unter Fabric verstehe ich ein Computernetzwerk, aber kein Design-Pattern. Meinst du nicht eher Factory oder Fabrik?
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 01.12.2008, 20:21  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

@Manko: shame on me! Habs ausgebessert...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Strukturierung größerrer Projekte #Avedo Software-Design 19 24.10.2008 11:10
[Erledigt] Singleton Fehler Andreas PHP-Fortgeschrittene 3 17.10.2008 16:27
referentieller T_PAAMAYIM_NEKUDOTAYIM nikosch PHP-Fortgeschrittene 31 28.05.2008 00:35
Gegenstück zu parent:: oder Singleton abstrakt implement. ?? Melchior PHP-Fortgeschrittene 13 26.07.2007 21:25
Verständnisfrage Singleton in PHP ve.ru PHP Tipps 2006 3 13.06.2006 20:36
Singleton besser als komplett statische Klasse ? Cmon PHP-Fortgeschrittene 4 13.06.2006 00:34
Singleton Klasse - falsche Werte PHP Tipps 2005 20 24.05.2005 12:07
USB-Ports per Registry disablen Orolhawion Off-Topic Diskussionen 5 23.08.2004 11:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysqli singleton, singleton mysqli, mysqli factory, mysqli verbindung in registry ablegen, mysqli singelton, php singleton mehrere seiten, php global vs singleton, singleton registry instanzen registrieren, aus performancegründen sollten sie mysqli verwenden, vorteile von mysqli, mysqli singleton registry, msqli singleton, mysqli factory class, mysqli als singleton, singleton mysqli problem, php registry datenbankverbindung, aus performancegründen sollten sie mysqli verwenden., php einfache registry, php5 mysqli singleton, php singleton vs static

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum