2012-02-08 78 views
3

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

如何制作继承自PDO的类,然后在将PDO类方法发送给父类之前拦截它们?目标是拦截传递给/从这些方法的参数,以便我的插件API可以工作。这是我正在使用的产品的插件API中没有的缺失部分。

回答

4

不是继承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.... 
} 
+0

这是我落得这样做。我也不得不做一些花哨的事情,因为PDO使用类方法创建了一个声明对象。所以,我不得不创建一个类似上面的PDOStatementStub类。然后,我使用__call()来截取并通过私有句柄变量的类方法运行它。 – Volomike 2012-02-08 10:51:22