2009-08-17 6 views
2

Ich habe versucht, OOP PHP5-Code zu machen. Aber ich denke, meine Versuche sind ungeschickt. Dies sind meine Fragen:OOP php5 Struktur

  • Ist es ein besserer, schlankerer Weg, Datenbankkonfigurationsinformationen einzuschließen?
  • Kann ich irgendwie herumkommen und $ db = new Db() in jeder Funktion deklarieren, die ich mache?
  • Sollte ich anstelle von Mysqli_database.php PEAR als Datenbankabstraktionsschicht verwenden?

Mysqli_database.php

<?php 
class Db { 
    private $connection; 

    private function open_connection() { 
     if (file_exists('config.inc.php')) { 
      require('config.inc.php'); 
     } else { 
      require('../config.inc.php'); 
     } 
     try 
     { 
      $this->connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); 
     } 
     catch (Exception $e) 
     { 
      throw $e; 
     } 
    } 
    private function close_connection() { 
     try 
     { 
      mysqli_close($this->connection); 
     } 
     catch (Exception $e) 
     { 
      throw $e; 
     } 
    } 
    public function query($query) { 
     try 
     { 
      $this->open_connection(); 
      $result = mysqli_query($this->connection,$query); 
      return $result; 
     } 
     catch (Exception $e) 
     { 
      throw $e; 
     } 
     $this->close_connection(); 
    } 
    public function fetchArray($query) { 
     $row = mysqli_fetch_assoc($query); 
     return $row; 
    } 
    public function count_rows($query) { 
     $row = mysqli_num_rows($query); 
     return $row; 
    } 
    public function rows_affected() { 
     $row = mysqli_affected_rows($this->connection); 
     return $row; 
    } 
    public function created_id() { 
     $row = mysqli_insert_id($this->connection); 
     return $row; 
    } 
} 
?> 

Test_data.php

<?php 
class Test_data { 
    public function show_text() { 
     $db = new Db(); 
     $sql = $db->query("SELECT * FROM test_table"); 
     $row = $db->fetchArray($sql); 
     echo 'This is the output: '.$row['text']; 
    } 
} 
?> 

config.inc.php

<?php 
$dbname  = 'database_name'; 
$dbhost  = 'localhost'; 
$dbuser  = 'database_user'; 
$dbpass  = 'database_password'; 
?> 

includes.php

<?php 
require_once('config.inc.php'); 
require_once('Mysqli_database.php'); 
$db = new Db(); 
$test_data = new Test_data(); 
?> 

index.php

<?php 
require_once('includes.php'); 
$test_data->show_text(); 
?> 

Antwort

3

Die Konfigurationsinformationen ist eine Frage des Geschmacks. Aber es wäre besser in einem Config-Objekt gespeichert und auf eine OO-Weise retreived dann globale Variablen aus einer anderen Datei.

Mit der singleton pattern können Sie ein neues Objekt erstellen.

Je mehr abstrahierte Ebene Sie auswählen, desto einfacher wird es, von einer Datenbank in eine andere zu wechseln. Sie können auch einen Blick auf PDO werfen.

+0

Recht , die config info holding ist eine Frage des Geschmacks, ich benutze gerne CONSTANTS, dann weißt du, dass es sich im globalen Umfang nicht ändern wird. – null

3

Es gibt einige wirklich gebräuchliche Muster zum Aufbau von Datenbankverbindungen: Singleton, Factory und manchmal Registry.

So könnte man aussehen.

<?php 

class DbConn 
{ 
    const CONN_DEV_1 = 'dev.db1'; 
    const CONN_PROD_1 = 'prod.db1'; 
    const CONN_DEV_2 = 'dev.db2'; 
    const CONN_PROD_2 = 'prod.db2'; 

    protected static $instances = array(); 

    protected $conn; 

    public static function factory($database, $env) 
    { 
    $connectionName = "$env.$database"; 
    if (!isset(self::$instances[$connectionName])) 
    { 
     switch ($connectionName) 
     { 
     case self::CONN_DEV_1: 
      $dbname = 'dev1'; 
      $dbhost = 'localhost'; 
      $dbuser = 'database_user'; 
      $dbpass = 'database_password'; 
      break; 
     case self::CONN_PROD_1: 
      $dbname = 'prod1'; 
      $dbhost = 'some.server'; 
      $dbuser = 'database_user'; 
      $dbpass = 'database_password'; 
      break; 
     case self::CONN_DEV_2: 
      $dbname = 'dev2'; 
      $dbhost = 'localhost'; 
      $dbuser = 'database_user'; 
      $dbpass = 'database_password'; 
      break; 
     case self::CONN_PROD_2: 
      $dbname = 'prod2'; 
      $dbhost = 'some.server'; 
      $dbuser = 'database_user'; 
      $dbpass = 'database_password'; 
      break; 
     default: 
      throw new Exception('Unrecognized database connection!'); 
     } 
     self::$instances[$connectionName] = new self($dbhost,$dbuser,$dbpass,$dbname); 
    } 
    return self::$instances[$connectionName]; 
    } 

    private function __construct($dbhost, $dbuser, $dbpass, $dbname) 
    { 
    $this->conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 
    } 

    /* all your other methods here */ 
} 

und in der Nutzung

$db1 = DbConn::factory('db1', 'dev'); 

Offensichtlich hier der Punkt ist, den Wert für $env aus der aktuellen Anwendung Config zu ziehen, wo immer das auch kommen mag.

jetzt in Bezug auf die Verwendung, in der Regel möchten Sie übergeben/Hand Funktionen/Klassen eine Datenbankverbindung, und sie nicht für den Aufbau der Verbindung selbst verantwortlich machen. Dies sorgt für eine lockere Kopplung. Um Ihr Beispiel zu verwenden:

<?php 
class Test_data 
{ 
    protected $db; 

    public function __construct(DbConn $db) 
    { 
     $this->db = $db; 
    } 

    public function show_text() 
    { 
     $sql = $this->db->query("SELECT * FROM test_table"); 
     $row = $this->db->fetchArray($sql); 
     echo 'This is the output: '.$row['text']; 
    } 
} 
?> 
2

Wie für eine Instanz in jeder Funktion erfassen, ein DB-Objekt wie das ist das de-facto-Beispiel für das Singleton-Muster gegeben. Es passt wirklich gut hier.

Hier ist ein einfaches Beispiel:

class DB 
{ 

    // Private Constructor so external code cannot directly instantiate 
    private function __construct() { 

    } 

    public static function instance() { 
    static $instance = false; 

    if (!$instance) 
     $instance = new DB(); 

    return $instance; 

    } 

} 

Und eine kleine Variation, wenn Sie mehrere DB-Verbindungen offen (zu verschiedenen Datenbanken) haben wollen, wäre eine Instanz Methode wie folgt sein:

public static function instance($dsn) { 
    static $instances = array(); 

    if (!isset($instances[$dsn])) 
     $instances[$dsn] = new DB($dsn); 

    return $instances[$dsn]; 

}