【问题标题】:Establishing PHP PDO DB Connections建立 PHP PDO DB 连接
【发布时间】:2016-06-18 14:33:22
【问题描述】:

我是在 PHP 中使用 PDO 的新手,在查看了一些示例代码后,我想知道如何最好地有效地处理数据库连接。

我的 dbconnector.php 中有以下内容来建立连接。回声只是测试代码:

try {
    $db = new PDO("mysql:host=$servername;dbname=$dbname", $appusername, $apppassword);
    // Set the PDO error mode to exception
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected Successfully";
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

在每个类中利用此代码的最佳方法是什么,这样我就不会将其复制到需要获取数据的每个函数中?我考虑过扩展 PDO 并根据需要创建一个 db 对象,但我阅读了一些似乎不鼓励这样做的帖子和文章,因为 PDO 已经是面向对象的。

【问题讨论】:

  • 你的问题没有多大意义。您正在使用类,但您不知道如何不重复一段简单的代码?这很奇怪。我想说:从头开始阅读你的 PHP 书。

标签: php pdo


【解决方案1】:

我考虑过扩展 PDO

这是一个完全可以理解的菜鸟错误。然而,这违反了(至少)SOLID 的两条规则:SRPLSP

单一职责原则:通过扩展PDO,您的新类现在已将数据访问耦合到新类打算执行的任何操作。

Liskov 替换原则:通过扩展 PDO,您也将新类声明为 PDO 的更大版本,但事实并非如此。任何类型提示 PDO (function foo(PDO $pdo)) 的函数都将接受您的新类作为参数 - 而实际上它不应该。

我认为开放-封闭原则也可以成立——但这足以让你思考。

类使用该数据库的输出而不是将整个数据库连接注入类可能更有意义。也就是说,与其强制您的新类使用数据库连接,不如将它需要的数据传递给该类。这是最简单的实现。

也就是说,有充分的理由需要将数据库连接注入到一个类中。但是,应该使用dependency injection 执行此操作。这是一个简短的例子:

class Foo
{
    public function __construct(PDO $pdo){
         $this->PDO = $pdo;
    }

    public function doTheThing(){
         $this->PDO->query(/* do whatever */);
         // ...
    }
}

$pdo = new PDO(/* whatever */);
$foo = new Foo($pdo);

这样,您可以基于自定义构建的PDO 实例实例化您的新类,并使用不同的PDO 对象访问不同的数据库。

如果你需要更进一步,你可以创建一个“数据访问”接口,创建实现它的对象,并为接口输入提示。然而,只注入一个PDO 实例是朝着正确方向迈出的美妙的第一步。

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 2021-04-19
    • 2016-04-15
    • 2021-05-26
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多