2012-03-29 3 views
1

Ich habe DB-Klasse, die wie dieMit DB-Verbindung überall innerhalb PHP-Anwendung

class db { 

    protected $db; 

    public function __construct() { 
     $this->connect(); 
    } 

    protected function connect() { 
     $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); 
     $this->db->set_charset('utf8'); 
    } 

} 

Jede Klasse in meiner PHP-Anwendung sieht erweitert diese db Klasse

Wie

class registration extends db { 

    var $validation; 

    function __construct() { 
     parent::__construct(); 
     $this->validation = new validation(); 
... 

und Validierung Aussehen wie das

class validation extends db { 

    var $ajax, $common; 

    function __construct() { 
     parent::__construct(); 
... 

Fehlermeldung "Zu viele Verbindungen". Ich fühle, dass dies nicht der richtige Ansatz ist: Ich verbinde mich jedes Mal mit db. Was ist Ihrer Meinung nach richtig? Ist es möglich, 1 Mal zu definieren ('db', ...) und überall in der App zu verwenden?

Antwort

0

Sie möchten stattdessen die Komposition verwenden. Möglicherweise sollten Sie auch das Singleton-Muster untersuchen.

Um dies näher auszuführen, die Zusammensetzung verwendet wird, jede Klasse in Ihrer Bibliothek hat eine Instanz der db Klasse statt eine Instanz der db Klasse sein.

Singleton bewirkt, dass die Klasse db nur eine Instanz der Klasse erzwingt, die jemals erstellt wurde. Dies ist nützlich für gemeinsam genutzte Ressourcen wie Datenbankverbindungen. Sehen Sie sich diesen Link an, um weitere Informationen zu diesem Thema zu erhalten.

http://php.net/manual/en/language.oop5.patterns.php

EDIT: Hinzufügen einiger Code

Drehen der db-Klasse in ein Singleton

<?php 
class db 
{ 
    static private $_oInstance = null; 
    protected $db; 

    private function __construct() 
    { 
     $this->connect(); 
    } 

    static public function getInstance() 
    { 
     if(self::$_oInstance === null) 
      self::$_oInstance = new db(); 
     return self::$_oInstance(); 
    } 

    protected function connect() 
    { 
     $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); 
     $this->db->set_charset('utf8'); 
    } 

} 

den Rest Ihrer Klassen Revisionieren die DB-Instanz zu komponieren, anstatt die db-Klasse erweitern

class registration 
{ 
    private $_oDb; 
    public $validation; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->_oDb = db::getInstance(); 
     $this->validation = new validation(); 
    } 

    // ... 
} 
+0

kann ich db verbindung definieren? – heron

+0

Ja, die 'db' Klasse ist im Wesentlichen unverändert von ihrem aktuellen Design. Sie ändern einfach, wie es sich auf den Rest des Codes in Ihrer Anwendung bezieht. – quickshiftin

+0

Ein "Problem" bei diesem Ansatz ist, dass _any_ class Zugriff auf die Datenbankressource hat. Sie können keine Verbindung zu einer zweiten Datenbank herstellen. Und Sie können nicht Ihren Code eine Unterklasse von 'db' verwenden. Die Abhängigkeitsinjektion wird allgemein als ein überlegenes Paradigma angesehen, insbesondere im Hinblick auf Modularität, Wartung und Tests. – Halcyon

1

registration und validation sind Klassen die verwendendb sind aber keine Unterklasse davon.

sollte Ihr Code wie folgt aussehen:

$db = new DB(); 
$db->connect(); 
$registration = new Registration($db); 

class Registration { 

    private $db; 

    public function __construct(DB $db) { 
     $this->db = $db; 
     ... 

Sie einen Verweis auf eine Instanz von $db allen Klassen übergeben, die es benötigen.

Der Grund, warum Sie zu viele Verbindungen öffnen, liegt vermutlich daran, dass derzeit jede Klasse eine eigene Verbindung zu Ihrer Datenbank herstellt, und das ist nicht das, was Sie tun möchten oder müssen.

+0

kann ich db-verbindung definieren? – heron

+0

@epic_syntax, ja, Sie können hier auch die Verbindung definieren. Diese Lösung ist die gleiche wie meine, außer dass Sie die Instanz der Klasse "db" in alle anderen Klassen übergeben, da sie in der Anwendung instanziiert werden, während bei Singleton jede Klasse eine Instanz der Klasse selbst erhalten kann, was der überall die gleiche Instanz. Dies ist vielleicht eine einfachere Lösung, wenn Sie mit Entwurfsmustern nicht vertraut sind, aber ich ermutige Sie dennoch, Singleton zu erkunden. Datenbankkonnektivität ist ein häufiger Anwendungsfall dafür. – quickshiftin