所以这是我多年来一直想要掌握的东西。将一些小型(单文件)应用程序转换为PDO。我可以使用PDO,连接数据库并运行查询,所有工作都可以。
但每次我初始化一个新的PDO时,我也必须运行
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
是的,它只有一条线,但有一天我可能需要在那里添加更多东西。对我来说,以某种方式扩展PDO类似乎更好,可以包括该行,这样我就可以用一行开始我的数据库连接。创建我自己的类,即使在这个阶段只添加一行代码,如果我决定在将来添加任何其他内容,也能让我面向未来。
我发现了这样的事情......
class myPDO extends PDO {
public function __construct($dsn, $user=null, $pass=null, $options=null) {
parent::__construct($dsn, $user, $pass, $options);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
// THEN A SIMPLE 1 LINER TO CONNECT - USING TRY/CATCH AS WELL OF COURSE
$pdo_conn = new myPDO($cfg['pdo_dsn'], $cfg['pdo_user'], $cfg['pdo_pass'], $cfg['pdo_options']);
扩展类时我假设我实际上不需要重新创建构造函数
有没有办法可以将我的$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
集成到我的班级而不用重新创建构造函数?
我刚刚开始使用PHP的类语法,所以对于某人来说这将是一个非常基本的问题,但它会同时为我回答一些其他问题。
答案 0 :(得分:2)
您无需在此处从PDO扩展。您想要的是您的应用程序中创建PDO对象的中心位置。然后,您可以随着时间的推移进行您喜欢的更改(例如,集成一些配置文件/系统),然后集中扩展。
有一点是你为它创建了一个类,我们称之为PdoFactory
:
class PdoFactory
{
/**
* @return PDO
*/
public function buildPdo() {
$pdo = new PDO($dsn = 'xyz', $user = 'abc', $pass = '', $options = '');
if ($pdoException = true) {
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $pdo;
}
}
用法:
$factory = new PdoFactory();
$pdo = $factory->buildPdo();
如您所见,这非常容易使用。您甚至可以将创建PdoFactory
的位置放在您调用buildPdo()
函数的位置之外。
这也更清楚你在这里处理两个不同的事情:首先创建Pdo对象(封装成它自己的类)和Pdo对象本身,它只是用于访问数据库。
我希望这会有所帮助。
答案 1 :(得分:1)
我认为问题在于,您正在将特定错误级别硬编码到应用程序中。如果您正在开发并且想要一切,该怎么办?如果您决定要更改特定应用程序的级别,该怎么办?将它保存为您在事后设置的参数会好得多,或者,如果您只是在子类化它,则将错误级别作为构造函数参数传递。