PHP PDO - 多个连接类的正确用法是什么?

时间:2018-02-13 19:32:12

标签: php oop pdo

我正在尝试学习PDO,并且所有资源都表示"使用PDO,您只需要为每个脚本连接一次。"

我如何确保?我一定要吗?什么是最佳做法?

所以,让我们说我有一个名为DatabaseConnection的PHP文件和类,其中包含我的凭据和诸如此类的东西,以及建立连接的方法:

我是否确保在每个页面/副作用脚本的开头连接到mySQL?

//homepage.php
//create header, body, etc, whatever
//$pdoConnection = DatabaseConnection::CREATE_CONNECTION;
//new Avatar($pdoConnection)

还是在课堂上?

//avatar.php
//class Avatar { ...
//$this->pdoConnection = DatabaseConnection::CREATE_CONNECTION;

换句话说,连接将如何流动?

database.php -> homepage.php -> avatar.php?
database.php -> avatar.php?

有关此主题的任何其他资源?许多人都深入研究PDO,但我找不到广泛的用法示例。

2 个答案:

答案 0 :(得分:3)

不是每个人都喜欢单身风格的类,但这是一个解决方案。拥有每个页面中包含的应用程序对象/类。

这个很好的部分是它只在你使用连接时连接,而不是所有页面都需要数据库连接

class App {

   private static $PDO_INSTANCE;

   public static function getPdoInstance() {
      if (!self::$PDO_INSTANCE) {
         self::$PDO_INSTANCE= // TODO build pdo connection
      }

      return self::$PDO_INSTANCE;
   }

}

然后使用它

$pdo = App::getPdoInstance();
// do db logic here

除原始答案外

我尝试将所有数据库访问权保留在一组类中,这个通用名称将是"数据访问层"或"数据存储库"。

这些类是唯一需要了解pdo连接的类。

例如

class calendar_page {

    function index() {
        $dal_calendar = new DalCalendar();
        $events = $dal_calendar->getEvents();
        // render html using data 
    }
}


class DataAccessLayer {

 private $pdo;

 function __construct() {
    $this>pdo = App::getPdoInstance();
 }

class DalCalendar extends DataAccessLayer  {

    function getEvents() {
          $this->pdo-> // query for events
          return $events;
    }

}

你传递连接的另一种方法是使用依赖注入,你必须谷歌更多信息,这不是我可以给你一个快速的例子。

答案 1 :(得分:2)

最简单的解决方案是使用Singleton模式。 ¹

这个想法是你有一个带有一个静态方法的类,它返回一个数据库连接的实例。连接将在静态方法的第一次调用中实例化,然后重用。例如:

class MyPDO
{
    private static $inst;

    public static getInstance()
    {
        if (!self::$inst)
            self::$inst = new PDO(/* your connection details */);

        return self::$inst;
    }
}

如果要在上下文中使用Singleton,请包含类文件(如果不使用自动加载器),并且可以立即使用PDO实例:

require_once "/path/to/MyPDO.php"; // it’s important to use require_once
$pdo = MyPDO::getInstance();

¹请注意,如今可能会认为Singleton更像是一种反模式,如果可能的话,首选依赖注入。

相关问题