我想创建一个用于处理数据库连接的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;
}
}
我认为这似乎没问题,但我习惯只使用像mysql_query
这样的东西而不确定将来会遇到什么问题。所以我认为这里的经验可以提供指导。
我有足够的东西吗?我应该使我的类Singleton,还是使用静态函数?有最好的做法吗?
我不想这样做,然后我有几个其他类使用它,发现我应该用不同的方式写它。
P.S。我刚刚注意到best-practices
标签不再被允许......这是否意味着现在也不鼓励这样的问题?
答案 0 :(得分:7)
当你第一次需要连接两个不同的数据库时,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);
}
}
在任何功能中,您只需:
$db = MyPDODB::loadDB();
$db->prepare($sql);
$db->execute();
简单,是吗?
答案 1 :(得分:6)
扩展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);
}
}
用法:
$Database = Database::Singleton(array('user' => 'root')); //....
$Database->query('Helooooooo Sexy MySql, Send me my Shizzle');
答案 2 :(得分:4)
单例和静态类都可以正常工作。我不能想到它会产生影响的情况。
确保如果有可能使用多个连接,则可以从一开始就使用Singleton / Static类多连接(使用连接数组或对象属性......)
可以被认为,所有这些方法创造了某种“上帝对象”,只不过是一种荣耀的global
,违背了真正的OOP原则。我曾经a question about this提出了很多很好的反馈意见。