从PHP的mysql扩展切换到PDO。扩展类以减少代码行

时间:2012-08-29 17:50:55

标签: php constructor pdo

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

2 个答案:

答案 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)

我认为问题在于,您正在将特定错误级别硬编码到应用程序中。如果您正在开发并且想要一切,该怎么办?如果您决定要更改特定应用程序的级别,该怎么办?将它保存为您在事后设置的参数会好得多,或者,如果您只是在子类化它,则将错误级别作为构造函数参数传递。