Лучшие практики для класса PDO?

Я хочу создать класс 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 или использовать статические функции? Есть ли наилучшая практика?

Я не хочу этого делать, после того, как я использовал несколько других классов, выясните, что я должен был написать это по-другому.

PS Я только заметил, что тег best-practices больше не разрешен … значит ли это значит, что такие вопросы теперь не поощряются?

Синглтон и статический класс будут работать нормально. Я не могу придумать ситуацию, когда это изменит ситуацию.

Удостоверьтесь, что, если когда-либо возможно использование нескольких соединений, вы можете с самого начала использовать многопользовательский режим Singleton / Static, используя массив соединений или свойства объекта …)

Можно утверждать, однако, что все эти методы создают «объект Бога» в некотором роде, являются всего лишь прославленным global и противоречат принципам реального ООП. Однажды я задал вопрос об этом, который дал много отличных отзывов.

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(); 

Легко, да?

расширьте 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. We return parent::query($modified_query); } } 

Применение:

 $Database = Database::Singleton(array('user' => 'root')); //.... $Database->query('Helooooooo Sexy MySql, Send me my Shizzle');