关于php:PDO课程的最佳实践?

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;
    }

}

我认为这似乎没问题,但是我习惯于使用像mysql_query这样的东西,并且不确定将来会遇到什么问题。所以我认为这里的经验可以提供指导。

我有足够的吗?我应该将类设置为单例,还是使用静态函数?是否有最佳实践?

我不想这样做,然后我在其他几个类使用它之后,发现我应该以不同的方式编写它。

另外,我刚刚注意到,不再允许使用best-practices标签……这是否意味着现在也不鼓励这样的问题?


当您第一次需要连接到两个不同的数据库(复制数据库或两个不同的数据库)时,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原则。我曾经问过一个问题,得到了很多很好的反馈。