php类中的pdo连接位置

php类中的pdo连接位置,php,pdo,database-connection,Php,Pdo,Database Connection,我现在正在使用PDO,我有很多类。 每次我使用一个类时,我并不总是使用它的数据库相关函数。有时我会一直使用一个类,直到最后我可能会对数据库做一些工作,比如将这个对象保存到DB 所以我现在正在做这样的事情: class Something { protected $pdo; function connect() { $this->pdo = new PDO( "mysql:host=".zConfig::read('hostname').";dbn

我现在正在使用PDO,我有很多类。 每次我使用一个类时,我并不总是使用它的数据库相关函数。有时我会一直使用一个类,直到最后我可能会对数据库做一些工作,比如将这个对象保存到DB

所以我现在正在做这样的事情:

class Something
{
   protected $pdo;

     function connect()
     {
        $this->pdo = new PDO( "mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password'));
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     }

     /* lots of functions doing lots of non-DB things */

     function saveToDB()
     {    $this->connect();
          $this->pdo->prepare("Some SQL that saves some stuff");
          // now do some DB-related pdo work
     }

}
我的问题是——这合理吗?这是你们很多人编写代码的方式吗

在我看来,有3种选择:

  • 我这样做的方式-只在那些 与数据库相关的函数。但这意味着每次我运行与DB相关的函数时
  • 在构造函数中打开一个连接,在这种情况下,我只打开它一次,但即使在我不需要它的时候也会打开它,所以我觉得有时候我会创建一个连接 免费连接
  • 另一方面,我可以使用这样的单例数据库类:

    class Something
    {
       protected $pdo;
    
         function connect()
         {
            $this->pdo = new PDO( "mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password'));
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         }
    
         /* lots of functions doing lots of non-DB things */
    
         function saveToDB()
         {    $this->connect();
              $this->pdo->prepare("Some SQL that saves some stuff");
              // now do some DB-related pdo work
         }
    
    }
    


  • 我在一个页面上有最多三个相关对象,有时我有,有时我不需要在一个页面上多次连接到DB。哪种设计更安全?

    您可以使用惰性方式

     protected $pdo;
    
     function connect()
     {
     if ($this->pdo === null)
        {
        $this->pdo = new PDO( "mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password'));
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
     }
    

    检查。

    你可以用懒惰的方式

     protected $pdo;
    
     function connect()
     {
     if ($this->pdo === null)
        {
        $this->pdo = new PDO( "mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password'));
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
     }
    

    选中。

    当您的对象定义为ex:

    class foo{
        public $conn;
    
        function __construct($conn){
        $this->conn = $conn;
        }
    
        function doSomething(){
        }
    }
    
    现在,如果您发现自己不想实例化连接,无论何时 位于不需要数据库连接的页面/工作区,并且会显著降低页面速度。在尝试连接时,请使用PDO属性

    ATT_PERSISTENT
    属性,如:

    $conn = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx', 
                    array( PDO::ATTR_PERSISTENT => true )
            );
    
    $object = new foo($conn);
    

    简单地说,一旦你打开一个页面,连接就建立了。
    ATTR\u PERSISTENT
    方法将存储该连接,就像会话工作一样,并将继续为你的页面提供信息,并在每次刷新页面或转到另一个页面时帮助你创建到数据库的新连接。试试看,它。。您将看到页面的加载速度有多快

    定义对象时,应在类中使用DI来实例化连接,例如:

    class foo{
        public $conn;
    
        function __construct($conn){
        $this->conn = $conn;
        }
    
        function doSomething(){
        }
    }
    
    现在,如果您发现自己不想实例化连接,无论何时 位于不需要数据库连接的页面/工作区,并且会显著降低页面速度。在尝试连接时,请使用PDO属性

    ATT_PERSISTENT
    属性,如:

    $conn = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx', 
                    array( PDO::ATTR_PERSISTENT => true )
            );
    
    $object = new foo($conn);
    

    简单地说,一旦你打开一个页面,连接就建立了。
    ATTR\u PERSISTENT
    方法将存储该连接,就像会话工作一样,并将继续为你的页面提供信息,并在每次刷新页面或转到另一个页面时帮助你创建到数据库的新连接。试试看,它。。您将看到页面的加载速度有多快

    什么是“DI”?我不完全明白你的意思。第二段代码何时使用?假设我在一个页面上实例化对象
    产品
    。我将在页面上使用该对象很长一段时间,但最后我需要保存它,如下面的
    $product->save()
    因此,如果我以
    $p=新产品开始页面$p->setVals(某些值)
    ,我应该在页面末尾做什么?我应该在什么时候用
    ATT_PERSISTENT
    添加您的第二个代码?就
    ATTR_PERSISTENT
    而言,您可以在任何地方添加它,不用担心。正如我所说的,它有点像会话,只需打开一次,它就会保持页面上的连接属性,一旦关闭页面,连接就会终止。现在,DI是依赖注入的缩写。你可以在谷歌上搜索,或者看看有没有什么想法。这是处理当今存在的连接的一种非常重要的方式“DI”是什么?我不完全明白你的意思。第二段代码何时使用?假设我在一个页面上实例化对象
    产品
    。我将在页面上使用该对象很长一段时间,但最后我需要保存它,如下面的
    $product->save()
    因此,如果我以
    $p=新产品开始页面$p->setVals(某些值)
    ,我应该在页面末尾做什么?我应该在什么时候用
    ATT_PERSISTENT
    添加您的第二个代码?就
    ATTR_PERSISTENT
    而言,您可以在任何地方添加它,不用担心。正如我所说的,它有点像会话,只需打开一次,它就会保持页面上的连接属性,一旦关闭页面,连接就会终止。现在,DI是依赖注入的缩写。你可以在谷歌上搜索,或者看看有没有什么想法。这是处理当今存在的连接的非常重要的方式