【发布时间】:2016-05-30 01:16:52
【问题描述】:
我开始一个新的支持twig的slim项目,我想使用PDO作为数据库层,集成的方式是什么?还是只使用 GLOBAL $db?
谢谢。
【问题讨论】:
-
通常,我就是这样做的。虽然这不是正确的做事方式,但就 OOP 而言,这很容易。当然,在将代码与可能使用相同变量名的其他库混合时,您需要非常小心。有关执行此操作的正确方法,请参见 glasz answer。
我开始一个新的支持twig的slim项目,我想使用PDO作为数据库层,集成的方式是什么?还是只使用 GLOBAL $db?
谢谢。
【问题讨论】:
我反对可变全局变量。你可以使用一个简单的工厂方法返回你的连接:
function db() {
static $db = null;
if (null === $db)
$db = new PDO(...);
return $db;
}
如果您要处理更多此类问题,请考虑使用注册表(请参阅this one)。
关于可变全局变量:
我反对这样的事情,因为它们很容易被变异。
如果在程序执行过程中情况发生意外变化,会发生什么情况?
东西坏了。
如果您是该项目的唯一工作人员,则全局变量可能没问题。
但根据我的经验,即使在这种情况下,跟踪全局变量也会变得很麻烦,并且会影响代码的逻辑组织。
如果您要与将覆盖此类全局的其他人共享您的代码怎么办?
此外,在 seperation of concerns 的上下文中,全局变量与 data encapsulation 的方法相矛盾。
所有这些都涉及到软件架构这一大而广泛的科学。
此外,在这种特定情况下使用工厂可确保您只保留一个对数据库连接的引用。
【讨论】:
$sth =null; 关闭吗?
看看这个项目:Slim-PDO(github)
文档is here
通过作曲家安装:
$ composer require slim/pdo
简单用法:
$app->container->singleton('database', function () use ($app) {
return new \Slim\PDO\Database($app->config('db.dsn'), $app->config('db.usr'), $app->config('db.pwd'));
});
// SELECT * FROM users WHERE id = ?
$selectStatement = $app->database->select()
->from('users')
->where('id', '=', 1234);
$stmt = $selectStatement->execute();
$data = $stmt->fetch();
// INSERT INTO users ( id , usr , pwd ) VALUES ( ? , ? , ? )
$insertStatement = $app->database->insert(array('id', 'usr', 'pwd'))
->into('users')
->values(array(1234, 'your_username', 'your_password'));
$insertId = $insertStatement->execute(false);
【讨论】: