【问题标题】:How do I intercept PDO calls?如何拦截 PDO 调用?
【发布时间】:2012-02-08 08:28:54
【问题描述】:

我正在尝试在我正在开发的基于 PHP 的产品中实现插件 API。我创建了一个继承自 PHP 的 PDO 类的类,然后添加了一些额外的方法。麻烦的是,我想在插件 API 中拦截诸如 PDO 的 .query()、.exec()、.execute() 和 .fetchAll() 之类的东西,处理传递给/从这些方法传递的参数。我尝试使用 __call($method,$args) 拦截器技术,但在这种情况下它不起作用,因为我无法将 PDO 方法标记为受保护。

如何创建一个从 PDO 继承的类,然后在 PDO 类方法发送到父类之前拦截它们? 目标是拦截传递给/从这些方法传递的参数,以便我的插件 API 可以工作。这是我正在开发的产品的插件 API 中缺少的部分。

【问题讨论】:

    标签: php oop inheritance pdo overloading


    【解决方案1】:

    不要继承 PDO,只需将其包装即可。

    只是一个例子:

    class MyDB {
        private $dbh;
    
        public function __construct($dsn, $username, $password, $driver_options = array()) {
           $this->dbh = new PDO($dsn, $username, $password, $driver_options);
        }
    
        public function query($statement) {
            //do something you want
            //...
            return $this->dbh->query($statement);
        }
    
        //and so on....
    }
    

    【讨论】:

    • 这就是我最终要做的。我还必须做一些花哨的事情,因为 PDO 创建了一个带有类方法的语句对象。所以,我必须创建一个 PDOStatementStub 类,它也执行上述操作。然后我使用 __call() 拦截并通过私有句柄变量的类方法运行它。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2011-06-11
    • 2018-11-07
    相关资源
    最近更新 更多