php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 26-12-2008, 23:31
Luka
 Registrierter Benutzer
Links : Onlinestatus : Luka ist offline
Registriert seit: Mar 2004
Beiträge: 215
Luka ist zur Zeit noch ein unbeschriebenes Blatt
Standard Singleton Pattern für DB Klasse

Hi,

Ich erweitere gerade meine MySQL Klasse mit dem singleton pattern. Dafür habe ich das untere in die DB Klasse eingefuegt.

PHP-Code:
 // Die Singleton Funktion 
    
public static function singleton() 
    { 
        if (!isset(
self::$instance)) { 
            
$c __CLASS__
            
self::$instance = new $c
        } 

        return 
self::$instance
    } 
In meiner index.php hatte ich nun immer diesen part:
PHP-Code:
 $object=new MySQL ($dbhost,$dbuser,$dbpass,$dbname); 
Und der constructor hat das dann verwendet:
PHP-Code:
public function __construct($dbhost,$dbuser,$dbpassword,$dbname
wenn ich es richtig verstanden habe faellt dieses nun weg und stattdessen benutze ich dieses
PHP-Code:
 $object=MySQL::singleton (); 
Was ich nun jedoch nicht verstehe, wie bekomme ich $dbhost,$dbuser,$dbpass,$dbname an die MySQL Klasse weitergereicht?

Ich hatte das bereits in einem anderen Forum versucht zu besprechen, dort ging das ganze Thema dann aber in eine Richtung der ich nicht mehr folgen konnte.
Ich hoffe mir kann hier jemand helfen, da ich einfach nicht weiter komme. Vielen Dank im Voraus.

Gruss Luka
Mit Zitat antworten
  #2 (permalink)  
Alt 27-12-2008, 00:15
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: Singleton Pattern für DB Klasse

Zitat:
Original geschrieben von Luka

Was ich nun jedoch nicht verstehe, wie bekomme ich $dbhost,$dbuser,$dbpass,$dbname an die MySQL Klasse weitergereicht?
Beispielsweise indem du der Singleton-Methode die benötigten Parameter übergibst, die sie ihrerseits an den Konstruktur der Klasse übergibt:
PHP-Code:

class Database
{
    static public function 
singleton($db_host$db_user, ...)
    {
        if (
is_null(self::$_instance))
        {
            
self::$_instance = new self($db_host$db_user, ...);
        }

        return 
self::$_instance;
    }

    protected function 
__construct($db_host$db_user, ...)
    {

    }
}


$db Database::singleton($db_host$db_user$db_pass$db_name); 
Du solltest die Sichtbarkeit des Konstrukturs übrigens auf protected einschränken, wenn die Klasse als Singleton implementiert werden soll. Das verhindet nämlich das direkte Erzeugen einer Instanz der Klasse durch new.

Grüße

Geändert von Griecherus (27-12-2008 um 00:18 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 27-12-2008, 00:20
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Oder eine weitere Methode, die die Instanz initialisiert.
PHP-Code:
public static function initInstance($dbhost,$dbuser,$dbpassword,$dbname) {
    
self::$instance=new self($dbhost,$dbuser,$dbpassword,$dbname);
}
public static function 
getInstance() { 
    if(
self::$instance===NULL) { 
        throw new 
Exception('Singleton not initialized');
    }
    return 
self::$instance

Das Singleton-Pattern ist aber schon fast ein Anti-Pattern. Meist ist eine Registry anbrachter.
Mit Zitat antworten
  #4 (permalink)  
Alt 27-12-2008, 00:27
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Oder aber durch eine Setter-Methode:
PHP-Code:
public function __set($name$value)
{
    switch (
$name)
    {
        case 
'db_host';
            
$this->db_host = (string)$value;
            break;

        ...
    }
}

$db Database::singleton();

$db->host 'localhost';
$db->user 'me';
$db->pass 'secret';
...

$db->connect(); 
Wenngleich ich keine Motivation sehe, das strukturell so zu lösen, ist es technisch eine Möglichkeit. Was das Registry-Pattern angeht, schließe ich mich PHP-Desaster an.
Mit Zitat antworten
  #5 (permalink)  
Alt 27-12-2008, 00:53
Luka
 Registrierter Benutzer
Links : Onlinestatus : Luka ist offline
Registriert seit: Mar 2004
Beiträge: 215
Luka ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich möchte meine DB Verbindung ja in einer anderen Klasse nutzen. Daher hatte ich bisher das $object an meine Login Klasse übergeben.

Ich verstehe nun jedoch nicht wie ich es mit dem singleton mache
PHP-Code:
object=MySQL::singleton (); 
gehört das in die index.php und ich muss weiter das $object an die Login Klasse übergeben oder gehört der Part in die die Login Klasse selber und es wird nichts mehr übergeben?
Mit Zitat antworten
  #6 (permalink)  
Alt 27-12-2008, 01:38
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Luka
Ich möchte meine DB Verbindung ja in einer anderen Klasse nutzen. Daher hatte ich bisher das $object an meine Login Klasse übergeben.
Und wieso sollte das jetzt nicht mehr gehen?
PHP-Code:
$db Database::singleton(
    
$db_host,
    
$db_user,
    
$db_pass,
    
$db_name
);

$login = new Login($db);

// login.class.php
class Login
{
    protected 
$_db null;

    public function 
__construct(Database $db)
    {
        
$this->_db $db;
    }

Wenn du das Singleton-Entwurfsmuster allerdings zweckentfremden und daraus einen "Globalisator" für deine Klassen machen möchtest, sieht das Ganze wieder anders aus:
PHP-Code:
class Login
{
    protected 
$_db null;

    public function 
__construct()
    {
        
// hier musst du nun natürlich dafür sorgen, dass die benötigten
        // Parameter existieren, also sie entweder dem Konstruktor
        // der Klasse ´Login` übergeben (was sehr unsauber gelöst
        // wäre) oder sie irgendwie* aus einem/dem global Skopus
        // holen
        
$this->_db Database::singleton($db_host, ...);
    }

Ich sage dabei aber nicht ohne Grund "zweckentfremden", denn dafür ist Singleton nicht gedacht, sonder das Registry Pattern*, das einen applikationsweiten globalen Gültigkeitsbereich (Skopus) für Parameter, Instanzen, Ressourcen usw. bereit stellt.

Geändert von Griecherus (27-12-2008 um 01:59 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 28-12-2008, 19:46
Luka
 Registrierter Benutzer
Links : Onlinestatus : Luka ist offline
Registriert seit: Mar 2004
Beiträge: 215
Luka ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

ok, ich glaube ich habe das mit dem Singleton völlig falsch verstanden. Ich dachte mir das eigentlich so, ich instanziere einmal das Objekt der MySQL Klasse. Das wird dann dank singleton wie soll man sagen, abgespeichert ist vielleicht das falsche Wort, aber mir fällt nichts besseres ein. Danach muss ich dann das Objekt nicht mehr an meine anderen Klassen übergeben sondern kann einfach über singleton in jeder beliebigen Klasse darauf zugreifen.

Wenn ich mir das jetzt so anschaue, ist das aber wohl nicht der Fall. Gibt es denn ein Pattern, was genau das macht was ich beschreibe? Benutzt Ihr singleton für Eure DB Verbindung oder was macht Ihr?
Mit Zitat antworten
  #8 (permalink)  
Alt 28-12-2008, 20:13
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Benutzt Ihr singleton für Eure DB Verbindung oder was macht Ihr?
Definitiv NEIN!
Ich arbeite meist mit einer Kombination aus Factory + Registry in meinem Application Object. Fertig!

Optimaler wäre das "Dependency Injection Design Pattern". Aber das ist meist mit Kanonen auf Spatzen in einer normalen PHP Anwendung.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #9 (permalink)  
Alt 29-12-2008, 01:36
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Wenn ich mir das jetzt so anschaue, ist das aber wohl nicht der Fall. Gibt es denn ein Pattern, was genau das macht was ich beschreibe? Benutzt Ihr singleton für Eure DB Verbindung oder was macht Ihr?
Wieso nicht? Bei dir ist nunmal der Fall, dass dieses einzelne Objekt noch Parameter von außen benötigt, d.h. du musst die Instanz erst korrekt initialisieren.
Den Rest hat combie ja bereits sehr gut beantwortet.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:05 Uhr.