Best practices for a PDO class?
我想创建一个用于处理数据库连接的PDO类。
以下是我的资料:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } } |
我认为这似乎没问题,但是我习惯于使用像
我有足够的吗?我应该将类设置为单例,还是使用静态函数?是否有最佳实践?
我不想这样做,然后我在其他几个类使用它之后,发现我应该以不同的方式编写它。
另外,我刚刚注意到,不再允许使用
当您第一次需要连接到两个不同的数据库(复制数据库或两个不同的数据库)时,singleton会让您大吃一惊。然后你的代码就乱七八糟了。
相反,使用单个静态函数轻松加载上次使用的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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); } } |
在任何功能中,您只需执行以下操作:
1 2 3 | $db = MyPDODB::loadDB(); $db->prepare($sql); $db->execute(); |
容易,嗯?
扩展PDO以更好地控制它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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); } } |
用途:
1 2 | $Database = Database::Singleton(array('user' => 'root')); //.... $Database->query('Helooooooo Sexy MySql, Send me my Shizzle'); |
单例类和静态类都可以正常工作。我想不出什么情况会有什么不同。
确保如果有可能使用多个连接,则从一开始就可以使单实例/静态类多连接(使用连接数组或对象属性…)
然而,可以说,所有这些方法都创造了某种"上帝的对象",只是一个荣耀的以东王(0),违背了真正的OOP原则。我曾经问过一个问题,得到了很多很好的反馈。