【问题标题】:Any suggestions to improve my PDO connection class?有什么建议可以改进我的 PDO 连接类吗?
【发布时间】:2010-06-09 21:30:20
【问题描述】:

我对 pdo 很陌生,所以我基本上只是使用我正在阅读的介绍性书籍中的信息组合了一个简单的连接类。但是这种连接有效吗?如果有人有任何有用的建议,我将不胜感激。

class PDOConnectionFactory{

    public $con = null;
    // swich database?
    public $dbType  = "mysql";
    
    // connection parameters

    public $host    = "localhost";
    public $user    = "user";
    public $senha   = "password";
    public $db  = "database";
    

    public $persistent = false;
    
    // new PDOConnectionFactory( true ) <--- persistent connection
    // new PDOConnectionFactory()       <--- no persistent connection
    public function PDOConnectionFactory( $persistent=false ){
        // it verifies the persistence of the connection
        if( $persistent != false){ $this->persistent = true; }
    }
    
    public function getConnection(){
            try{
                $this->con = new PDO($this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->senha, 
                array( PDO::ATTR_PERSISTENT => $this->persistent ) );
                // carried through successfully, it returns connected
                return $this->con;
            // in case that an error occurs, it returns the error;
            }catch ( PDOException $ex ){  echo "We are currently experiencing technical difficulties.  ".$ex->getMessage(); }

    }
    
    // close connection
    public function Close(){
        if( $this->con != null )
            $this->con = null;
    }
}

【问题讨论】:

  • 我会将public $persistent 重命名为public $isPersistent(这里的口味问题),并且还将构造函数if 行改为简单地读取$this-&gt;isPersistent = $persistent;。其他public 变量($con、$dbType、$host、$user、$senha、$db)可能应该是private。在实现“工厂”时,通常使用它的其他类、方法等不必知道或关心连接、用户名、密码等。
  • 你知道这个过程是否有效吗?有没有更好的办法?我还没有时间更深入地学习编码模式和 OOP,所以我只是在寻找一个开始的地方,这样我就可以维持我的网站,直到我更新它。
  • 这是“更好的方式”的开始。如果您练习关注点分离,那么以后维护代码时就不会那么辛苦了。但是,如果您将 mysql 连接对象和 select 语句字符串散布在您的页面上,您将会遇到问题。相反,如果你使用一个类来分离你的数据库层,甚至像创建一个名为 DataAccessLayer 的类和一个名为 GetThing() 的函数,然后是 $dal = new DataAccessLayer() 并调用 $dal-&gt;GetThing() 这样简单,你将更容易维护你的代码.

标签: php pdo


【解决方案1】:

在实现“工厂”时,通常使用它的其他类、方法等不必知道或关心连接、用户名、密码等。

我会做的更像是:

static class PDOConnectionFactory {
    // database
    private $dbType = "mysql";

    // connection parameters
    private $host = "localhost";
    private $user = "user";
    private $senha = "password";
    private $db = "database";

    // new CreateNewConnection( true ) <--- persistent connection
    // new CreateNewConnection()       <--- no persistent connection
    public function CreateNewConnection($persistent = false) {
        try {
            $con = new PDO($dbType . ":host=" . $host . ";dbname=" . $db, $user, $senha, array(PDO::ATTR_PERSISTENT => $persistent));
            // carried through successfully, it returns connected
            return $con;
        }
        catch (PDOException $ex) {
            // in case that an error occurs, it returns the error;
            echo "We are currently experiencing technical difficulties. We have a bunch of monkies working really hard to fix the problem. Check back soon: " . $ex->getMessage();
        }
    }
}

然后你可以以任何你需要的方式使用 CreateNewConnection() 返回的连接。

我没有检查上面的代码是否编译,可能有一些错别字/问题,但你明白了。现在你需要更进一步,实现类似于存储库模式的东西:)

【讨论】:

    【解决方案2】:

    我的建议是您实现一个单例以将 PDO 的实例化限制为一个对象。它可能看起来像这样:

    class Database {
    
        protected static $_instance;
        protected $_connection;
        protected $_dns = 'mysql:host=localhost;dbname=mydbname';
        protected $_username = 'myusername';
        protected $_password = 'mypassword';
    
        /**
        * Singleton pattern implementation makes "new" unavailable
        */
        protected function __construct()
        {
            $this->_connection = 
                new PDO($this->_dns, $this->_username, $this->_password);
        }
    
        public function getConnection()
        {
            return $this->_connection;
        }
    
        public static function getInstance()
        {
            if (null === self::$_instance) {
                self::$_instance = new self();
            }
            return self::$_instance;
        }
    
        /**
        * Singleton pattern implementation makes "clone" unavailable
        */
        protected function __clone()
        {}
    }
    
    
    $dbc = Database::getInstance()->getConnection();
    

    【讨论】:

    • 切换有什么好处?
    • 此模式旨在避免多个实例。使用数据库连接时,您通常只想打开该连接一次,而不是每次请求 PDO 对象时。这就是构造函数和 __clone 方法不公开的原因。它的实例化总是由 getInstance() 处理。
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2012-02-20
    • 2010-09-20
    • 2018-12-25
    • 2012-02-07
    相关资源
    最近更新 更多