制作 PDO mysql 静态连接类的最佳方法?

Posted

技术标签:

【中文标题】制作 PDO mysql 静态连接类的最佳方法?【英文标题】:Best way to make a PDO mysql static connection class? 【发布时间】:2012-04-01 10:06:10 【问题描述】:

我对 PDO 和 php 的 OOP 还是很陌生,所以请注意 :) 基本上我正在尝试基于 PDO 创建一个连接对象,这样我就可以在整个站点中调用一个连接。

我需要一些准备好的语句,这些语句可以根据我使用下面尝试创建的相同 db 对象传递的 ID 来查找不同的结果。

如何创建和访问我在下面设置的 db 类,然后使用其中的函数来提取我需要的相关信息?任何示例都会很棒,因此我可以了解最佳实践等。

非常感谢。

class db 

    private static $connection;

    private function __construct()
    private function __clone()

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") 
        if(!$this->connection)
            try
                $this->connection = new PDO($db_server, $db_user, $db_pass);
             catch (PDOException $e) 
                $this->connection = null;
                die($e->getMessage());
            
        
        return $this->connection;
    



$dbh = new db::connect();

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?");
if($stmt->execute(array($_REQUEST['testid']))) 
  while ($row = $stmt->fetch()) 
    print_r($row);
  

【问题讨论】:

伪变量 $this 在静态方法和静态属性中不可用。你应该使用 self::$property。否则它会说属性 db::property not defined @BubuDaba 儿子不要在问题中编辑不正确的代码,因为它会使其他问题变得无关紧要。如果您对 OP 有任何建议,请写下答案或评论 【参考方案1】:

你可以从不再使用单例模式开始。它(以及一般的静态类)是不好的,原因与过程编程中的全局变量不好的原因相同。

也就是说...与其试图强制连接对象的唯一性,不如确保在所有地方都使用相同的连接。

这是我的意思的一个例子:

class Foo

    protected $connection = null;
    public function __construct( PDO $connection ) 
    
        $this->connection = $connection;
    


class Bar

    // all the same as in Foo


$connection = new PDO('sqlite::memory');

$foo = new Foo( $connection );
$bar = new Bar( $connection );

此时$foo$bar 对象都可以访问相同的 PDO 实例。如果您有一个需要访问数据库的对象,那么您只需在构造函数中为其提供一个连接即可。

您可能想观看两个视频(幻灯片将包含 Java 代码,但您应该没有问题理解它):

Global State and Singletons Don't Look For Things!

【讨论】:

你为什么说静态类通常不好——我为自己的 PDO 包装器使用静态类......似乎对我来说效果很好。我们应该避免它们有什么特别的原因吗? @BenGriffiths,有几个原因。主要问题是 static classes 不能使用多态性。方法的执行与类的 name 相关联。这也不是真正的OOP。静态类实际上只是为了表演。你所拥有的是函数列表,绑定在命名空间结构中。无论如何,你应该研究这个主题。有很多材料。 You can start here如果你愿意学习一些更好的做法。 谢谢,我会调查的。我个人使用 static 的原因是因为我不必到处声明该类,也不必一直将其传递给其他对象——它作为一种常量对象很有用。在我自己的情况下,我不需要一个庞大的类,但是将它封装在一个小的静态类中使它更整洁,更易于管理。【参考方案2】:

内置持久连接:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

见Example #4 Persistent connections

【讨论】:

这很有用,即使它没有提供原始问题的答案,也许它应该作为评论发布.../*Or maybe because your*/ class Answer extends LogicException; try $to= include('some/more.php');''and $re=new Answer();if('you want'==$to); catch(Points $for) new Answer() or die($for.'this');

以上是关于制作 PDO mysql 静态连接类的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

利用PDO.so连接并读取Mysql数据库 核心代码实现讲解

PDO 连接与连接管理

pdo连接mysql操作方法

php pdo对象使用详解: 连接数据库与exec方法

php+mysql 请问:用pdo如何获取某个表中记录的数目?

mysql pdo 事务和会话存储