0

所以这是我多年来一直想要解决的问题。将一些小型(单文件)应用程序转换为 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 的类语法,所以这对某人来说是一个非常基本的问题,但它会同时为我回答一些其他问题。

4

2 回答 2

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 对象本身,它仅用于访问数据库。

我希望这有帮助。

于 2012-08-30T07:38:18.640 回答
1

在我看来,问题在于您将特定的错误级别硬编码到您的应用程序中。如果您正在开发中并且想要一切怎么办?如果您决定要更改特定应用程序的级别怎么办?最好将其保留为事后设置的参数,或者,如果您一心要对它进行子类化,则将错误级别作为构造函数参数传递。

于 2012-08-29T17:54:08.980 回答