2012-02-08 105 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