I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:<?php/** * PHP Document Object plus * * PHP Document Object plus is library with functionality of PDO, entirely written * in PHP, so that developer can easily extend it's classes with specific functionality, * such as providing database usage statistics implemented in v1.0b * * @author Peter Pokojny * @licensehttp://opensource.org/licenses/gpl-license.php GNU Public License */classPDOp{ protected$PDO; public$numExecutes; public$numStatements; public function__construct($dsn,$user=NULL,$pass=NULL,$driver_options=NULL) {$this->PDO= newPDO($dsn,$user,$pass,$driver_options);$this->numExecutes=0;$this->numStatements=0; } public function__call($func,$args) { returncall_user_func_array(array(&$this->PDO,$func),$args); } public functionprepare() {$this->numStatements++;$args=func_get_args();$PDOS=call_user_func_array(array(&$this->PDO,'prepare'),$args); return newPDOpStatement($this,$PDOS); } public functionquery() {$this->numExecutes++;$this->numStatements++;$args=func_get_args();$PDOS=call_user_func_array(array(&$this->PDO,'query'),$args); return newPDOpStatement($this,$PDOS); } public functionexec() {$this->numExecutes++;$args=func_get_args(); returncall_user_func_array(array(&$this->PDO,'exec'),$args); } } classPDOpStatementimplementsIteratorAggregate{ protected$PDOS; protected$PDOp; public function__construct($PDOp,$PDOS) {$this->PDOp=$PDOp;$this->PDOS=$PDOS; } public function__call($func,$args) { returncall_user_func_array(array(&$this->PDOS,$func),$args); } public functionbindColumn($column, &$param,$type=NULL) { if ($type===NULL)$this->PDOS->bindColumn($column,$param); else$this->PDOS->bindColumn($column,$param,$type); } public functionbindParam($column, &$param,$type=NULL) { if ($type===NULL)$this->PDOS->bindParam($column,$param); else$this->PDOS->bindParam($column,$param,$type); } public functionexecute() {$this->PDOp->numExecutes++;$args=func_get_args(); returncall_user_func_array(array(&$this->PDOS,'execute'),$args); } public function__get($property) { return$this->PDOS->$property; } public functiongetIterator() { return$this->PDOS; } }?>Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.