【问题标题】:Switching from PHP's mysql extension to PDO. Extend class to reduce lines of code从 PHP mysql 扩展切换到 PDO。扩展类以减少代码行
【发布时间】:2012-08-29 17:50:55
【问题描述】:

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

【问题讨论】:

    标签: php constructor pdo


    【解决方案1】:

    您不需要从此处扩展 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 对象本身,它只是用于访问数据库。

    我希望这会有所帮助。

    【讨论】:

    • 不错!问题...我的数据库配置参数存储在一个数组中。我真的不想在课堂上对它们进行硬编码——尽管它和在我的配置数组中一样容易更改。我意识到我可以将这些作为参数传递给PdoFactory() 类实例化。但是还有其他选项可以将它们引入 PdoFactory/buildPdo 函数吗?常量是一个坏主意,因为它们可以在我的整个应用程序中访问,全局变量也是如此。我想我可以在课程开始时对数组进行全局化,然后在最后将它们从全局变量中取消设置?
    • @batfastad:代码是为了示范。例如,您可以使用它的构造函数将配置数组传递给对象(需要自然添加,因为现在 __construct 函数尚未定义)。然后在您从该数组中读取的 buildPdo 函数中。
    • 我明白了,所以我将数组作为参数传递给我的类 def,然后依次传递给 buildPdo 函数,以便new PDO() 位可以访问数据?另外,需要“自然地”添加是什么意思?
    • 因为它还没有。所以需要添加它,否则它仍然不存在:) 就是这样。 ;) 当然,我可以把“自然”这个词去掉 :) 因为否则它不会起作用,所以应该是不言自明的。
    • 哦,对了,谢谢 ;) 所以与其扩展 PDO 类,不如说这是一个包装器。现在应该/我可以把我的 try-catch 块放在这个类中吗?还是我应该在父代码之外执行此操作?
    【解决方案2】:

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

    【讨论】:

    • 很公平,我知道你来自哪里。这样做至少我可以只在一个地方更改错误报告,而不是在每次出现 PDO 类实例化时更改。当然,我总是希望触发错误,然后我可以记录它们并在我的异常/错误处理程序中调整显示?这个问题我已经排好一阵子了。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2013-09-01
    • 2016-12-21
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多