我想创建一个PDO类来处理数据库连接.
这是我有的:
require('php/packages/store/store_db_settings.php');
class store_pdo
{
private $DBH; // Data Base Handler
function __construct()
{
$DBH = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
}
public function getHandler()
{
return $DBH;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这似乎没问题,但是我习惯于只使用类似的东西,mysql_query而且不确定将来会遇到什么问题.所以我认为这里的经验可以提供指导.
我有足够的东西吗?我应该使我的类Singleton,还是使用静态函数?有最好的做法吗?
我不想这样做,然后我有几个其他类使用它,发现我应该用不同的方式写它.
PS我只是注意到best-practices标签不再被允许......这是否意味着现在也不鼓励这样的问题?
当您第一次需要连接到两个不同的数据库时,Singleton会咬你,无论是复制还是两个不同的数据库.然后你的代码搞砸了.
而是使用单个静态函数轻松加载上次使用的配置:
class MyPDODB extends PDO
{
// Prevent unconfigured PDO instances!
private function __construct($config)
{
$dsn = sprintf('mysql:dbname=%s;host=%s;port=%d;', $config['database'], $config['hostname'], $config['port']);
parent::__construct($dsn, $config['username'], $config['password']);
}
public static function loadDB($config_in = null)
{
static $last_config = null;
if (!is_null($config_in))
{
self::validateConfig($config_in);
$config = $config_in;
if (!isset($config['isTemp']) || $config['isTemp'] !== true)
{
$last_config = $config;
}
}
else
{
if (!is_null($last_config)) { $config = $last_config; }
else throw new MyDBException("No config provided');
}
return new MyPDODB($config);
}
}
Run Code Online (Sandbox Code Playgroud)
在任何功能中,您只需:
$db = MyPDODB::loadDB();
$db->prepare($sql);
$db->execute();
Run Code Online (Sandbox Code Playgroud)
好吗,对吧?
扩展PDO以使您更好地控制它.
class Database Extends PDO
{
static $instance; //singleton
static function Singleton($params = false)
{
if(!isset(self::$instance))
{
self::$instance = new self($params); //tomh
self::$instance->init();
}
return self::$instance;
}
private function __construct(){}; //not allowed with singleton.
public function init($params) //Override PDO::__construct()
{
parent::__construct($params);
}
public function query($query)
{
//Catch,Custom Query Object maybe. W.e
return parent::query($modified_query);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
$Database = Database::Singleton(array('user' => 'root')); //....
$Database->query('Helooooooo Sexy MySql, Send me my Shizzle');
Run Code Online (Sandbox Code Playgroud)