我刚开始在PHP中使用PDO,在查看了一些示例代码之后,我想知道如何更有效地处理db连接。
我的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已经是面向对象的。
发布于 2016-06-18 16:14:51
我考虑过扩展PDO
这是一个完全可以理解的新手错误。然而,这违反了(至少)实心的两个规则:SRP和LSP。
单责任原则:通过扩展PDO,您的新类现在已经将数据访问耦合到新类要做的任何事情。
Liskov替换原则:通过扩展PDO,您还可以将新类声明为PDO的更大版本,而它不是。任何为PDO (function foo(PDO $pdo))键入提示的函数都会接受您的新类作为参数--而实际上它不应该。
我认为可以为开闭原则提供一个案例,但这给了你足够的思考。
类使用来自该数据库的输出可能更有意义,而不是将整个数据库连接注入类中。也就是说,与其强制新类使用数据库连接,不如只将它所需的数据传递给类。这是最简单的实现。
也就是说,有充分的理由需要将数据库连接注入到类中。但是,应该使用依赖注入来完成这一任务。下面是一个简单的例子:
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实例是朝着正确方向迈出的美妙的第一步。
https://stackoverflow.com/questions/37898112
复制相似问题