--TEST-- Extending PDO Test #3 --DESCRIPTION-- Verification of capabilities for extending PDO. --ENV-- PHPT_EXEC=true --SKIPIF-- --FILE-- exec("CREATE TABLE [$tableName] (id int NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))"); $stmt1 = $conn1->prepare("INSERT INTO [$tableName] VALUES(?, ?, ?)"); var_dump(get_class($stmt1)); foreach ($data as $row) { $stmt1->execute($row); } unset($stmt1); echo "===QUERY===\n"; // Retrieve test data via a direct query $stmt1 = $conn1->query("SELECT * FROM [$tableName]"); var_dump(get_class($stmt1)); var_dump(get_class($stmt1->dbh)); echo "===FOREACH===\n"; foreach($stmt1 as $obj) { var_dump($obj); } echo "===DONE===\n"; // Cleanup DropTable($conn1, $tableName); $stmt1 = null; $conn1 = null; EndTest($testName); } class ExPDO extends PDO { function __destruct() { echo __METHOD__ . "()\n"; } function query(string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false { echo __METHOD__ . "()\n"; $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('ExPDOStatement', array($this)))); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); return ($stmt); } } class ExPDOStatement extends PDOStatement { public $dbh; protected function __construct($dbh) { $this->dbh = $dbh; echo __METHOD__ . "()\n"; } function __destruct() { echo __METHOD__ . "()\n"; } function execute(?array $params = null) : bool { echo __METHOD__ . "()\n"; return parent::execute(); } } //-------------------------------------------------------------------- // Repro // //-------------------------------------------------------------------- function Repro() { try { Extend(); } catch (Exception $e) { echo $e->getMessage(); } } Repro(); ?> --EXPECT-- string(5) "ExPDO" string(12) "PDOStatement" ===QUERY=== ExPDO::query() ExPDOStatement::__construct() ExPDOStatement::execute() string(14) "ExPDOStatement" string(5) "ExPDO" ===FOREACH=== array(3) { ["id"]=> string(2) "10" ["val"]=> string(3) "Abc" ["val2"]=> string(3) "zxy" } array(3) { ["id"]=> string(2) "20" ["val"]=> string(3) "Def" ["val2"]=> string(3) "wvu" } array(3) { ["id"]=> string(2) "30" ["val"]=> string(3) "Ghi" ["val2"]=> string(3) "tsr" } ===DONE=== ExPDOStatement::__destruct() ExPDO::__destruct() Test "PDO - Extension" completed successfully.