Php mysql singlton db sınıf yapma herhangi bir basit / daha iyi bir yolu?

4 Cevap php

İşte kullanıyorum biri:

<?php
final class Database {
    private static $oDb;
    public static function init() {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect('localhost', 'mysql_user', 'mysql_password') or die(mysql_error());
            mysql_select_db('mysql_db_name', self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

Kullanımı:

$oDb = Database::init();
$sql = foo;
$oDb->query($sql);

Ben sadece bu bir sorgu işlevini bağlamak ve yürütmek istiyorum varsayarsak, ben sınıf yapmak gerekir herhangi bir gelişme var mı? Bellek ya da kod verimliliği?

Ayrıca, ben bir yapılandırma dosyasından db kimlik bilgilerini alabilirsiniz etkili bir yolu var mı? Benim sınıfın içine dahil kullanamazsınız biliyorum.

4 Cevap

Ben genellikle durum bu tür için tembel başlatma kullanın ve yalnızca (Singleton deseni başına) dışında Destekleme önlemek için özel bir kurucu ile, (bu durumda) bir genel yöntem vardır:

class Database {
  private static $instance;
  private $conn;

  private function Database() {
    // do init stuff
    require_once('dbconfig.php'); // contains define('DB_USER', 'webuser'); etc...
    $this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS); // do error checking
  }

  public static function getInstance() {
    if(!self::$instance) {
      self::$instance = new Database();
    }
    return self::$instance;
  }

  public static function query($sql) {
    $instance = self::getInstance();
    return mysql_query($sql, $instance->conn);
  }
}

Sonra sadece bunu kullanmak gerekir $dbHandle = Database::getInstance() zaman arayabilirsiniz. Statik bir sorgu yöntemi tanımlanmış olduğundan veya bu durumda, hiç init her türlü aramak zorunda kalmadan Database::query("select * from xx;"); kullanabilirsiniz.

Bu ince çalışacağını, onu alır gibi bir basit.

Sen () init için kimlik bilgilerinizi iletebilirsiniz;

include(config.php);
$oDb = Database::init( DB_HOST, DB_NAME, DB_USER, DB_PASSWORD );
$sql = foo;
$oDb->query($sql);

Sen bir sınıfın içinde bir işlev içinde dahil kullanabilirsiniz

<?php
final class Database {
    private static $oDb;
    public static function init() {
        if(self::$oDb == NULL)
        {
            include('config.php')
            self::$oDb = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
            mysql_select_db(DB_NAME, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

ya da sadece değişkenleri geçebilir ...

<?php
final class Database {
    private static $oDb;
    public static function init($host, $user, $pass, $name) {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect($host,$user,$pass) or die(mysql_error());
            mysql_select_db($name, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

ya da bir php.ini dosyasında kimlik bilgilerini saklayabilirsiniz

<?php
final class Database {
    private static $oDb;
    public static function init($db_name) {
        if(self::$oDb == NULL)
        {
            self::$oDb = mysql_connect() or die(mysql_error());
            mysql_select_db($db_name, self::$oDb) or die (mysql_error());;
        }
        return self::$oDb;
    }
    public function query($sql)
    {
        return mysql_query($sql) or die(mysql_error());
    }
}
?>

php.ini dosyası:

mysql.default_host="host"
mysql.default_user="user"
mysql.default_password="password"

Tekiz sınıflar için Dan Breen izledi modeli temiz ve çok yaygındır. Ancak, bu durumda, ben de örnekleme anda varsayılan yapılandırma geçersiz, ya da sadece bir bağlantı (hem kullanım-vakaları yaratmadan bir başvuru almak böylece getInstance yöntem bazı parametreleri kabul sağlayacak zaman zaman).

DatabaseFunctions.php

require_once("../path/to/config/database.php");

class Database {
  private static $instances = array();

  private function Database($host, $user, $password, $name) {
    // do init stuff
  }

  public static getInstance(
    $host=DB_HOST, $user=DB_USER, $password=DB_PASSWORD, $name=DB_NAME
  ) {
    $key = strtolower($host . $user . $password . $name);

    if ( !$self::instances[$key] ) {
      $self::instances[$key] = new Database($host, $user, $password, $name);
    }
    return $self::instances[$key];
  }
}

..config / database.php:

define("DB_HOST", "localhost");
define("DB_USER", "mrsqlguy");
define("DB_PASS", "!!!");
define("DB_NAME", "just_another_wordpress");

Düzenleme: Ben sadece her bağlantı yeri / veritabanı için bir örneğini almak sağlamak için daha fazla bir flyweight gibi hareket onu değiştirdik. Bu endişeleri adresleri ve esneklik bir ölçüde korur.