pdo_026.phpt 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. --TEST--
  2. PDO Common: extending PDO (2)
  3. --EXTENSIONS--
  4. pdo
  5. --SKIPIF--
  6. <?php
  7. $dir = getenv('REDIR_TEST_DIR');
  8. if (false == $dir) die('skip no driver');
  9. require_once $dir . 'pdo_test.inc';
  10. PDOTest::skip();
  11. ?>
  12. --FILE--
  13. <?php
  14. if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
  15. require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
  16. $data = array(
  17. array('10', 'Abc', 'zxy'),
  18. array('20', 'Def', 'wvu'),
  19. array('30', 'Ghi', 'tsr'),
  20. );
  21. class PDOStatementX extends PDOStatement
  22. {
  23. public $dbh;
  24. protected function __construct($dbh)
  25. {
  26. $this->dbh = $dbh;
  27. echo __METHOD__ . "()\n";
  28. }
  29. function __destruct()
  30. {
  31. echo __METHOD__ . "()\n";
  32. }
  33. }
  34. class PDODatabase extends PDO
  35. {
  36. function __destruct()
  37. {
  38. echo __METHOD__ . "()\n";
  39. }
  40. function query($sql, ...$rest): PDOStatement|false
  41. {
  42. echo __METHOD__ . "()\n";
  43. $stmt = $this->prepare($sql, array(PDO::ATTR_STATEMENT_CLASS=>array('PDOStatementx', array($this))));
  44. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  45. $stmt->execute();
  46. return $stmt;
  47. }
  48. }
  49. $db = PDOTest::factory('PDODatabase');
  50. var_dump(get_class($db));
  51. $db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))');
  52. $stmt = $db->prepare("INSERT INTO test VALUES(?, ?, ?)");
  53. var_dump(get_class($stmt));
  54. foreach ($data as $row) {
  55. $stmt->execute($row);
  56. }
  57. unset($stmt);
  58. $stmt = $db->query('SELECT * FROM test');
  59. var_dump(get_class($stmt));
  60. var_dump(get_class($stmt->dbh));
  61. foreach($stmt as $obj) {
  62. var_dump($obj);
  63. }
  64. echo "===DONE===\n";
  65. ?>
  66. --EXPECT--
  67. string(11) "PDODatabase"
  68. string(12) "PDOStatement"
  69. PDODatabase::query()
  70. PDOStatementX::__construct()
  71. string(13) "PDOStatementX"
  72. string(11) "PDODatabase"
  73. array(3) {
  74. ["id"]=>
  75. string(2) "10"
  76. ["val"]=>
  77. string(3) "Abc"
  78. ["val2"]=>
  79. string(3) "zxy"
  80. }
  81. array(3) {
  82. ["id"]=>
  83. string(2) "20"
  84. ["val"]=>
  85. string(3) "Def"
  86. ["val2"]=>
  87. string(3) "wvu"
  88. }
  89. array(3) {
  90. ["id"]=>
  91. string(2) "30"
  92. ["val"]=>
  93. string(3) "Ghi"
  94. ["val2"]=>
  95. string(3) "tsr"
  96. }
  97. ===DONE===
  98. PDOStatementX::__destruct()
  99. PDODatabase::__destruct()