我是新手在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已经是面向对象的。
答案 0 :(得分:0)
我考虑过扩展PDO
这是一个完全可以理解的菜鸟错误。但是,这违反了(至少)SOLID:SRP和LSP两个规则。
单一责任原则:通过扩展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
对象访问不同的数据库。
如果您需要更进一步,可以创建一个"数据访问"接口,创建实现它的对象,以及接口的typehint。但是,注入一个PDO
实例是朝着正确方向迈出的美好的第一步。