У меня есть собственный класс базы данных, который расширяет PDO. Я ищу практичный способ манипулирования результатами запроса, чтобы я мог применить определенные преобразования к данным, например, создать DateTime
объекты из столбцов даты.
У меня сложилось впечатление, что расширение PDOStatement
- это путь, поэтому я написал собственный класс:
class MyPDOStatement extends PDOStatement{
}
... и передал соответствующий параметр в мой пользовательский метод подключения:
class MyPDO extends PDO{
public function connect($dsn, $user, $pass){
$options = array(
PDO::ATTR_STATEMENT_CLASS => array('MyPDOStatement'),
);
parent::__construct($dsn, $user, $pass, $options);
}
}
Я понятия не имею, что делать дальше. Когда я var_dump()
утверждение, которое я вижу, PDO фактически использует мой собственный класс MyPDOStatement
, и я могу foreach()
объект нормально, но я не могу найти способ изменить результаты. Я попытался переопределить публичные методы, но они, похоже, не выполняются:
public function fetch($fetch_style=NULL, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0){
die(__METHOD__ . ' is actually called'); // Never happpens
}
... хотя PHP жалуется, если подписи не совпадают:
Strict Standards: Declaration of MyPDOStatement::fetch() should be compatible with that of PDOStatement::fetch()
Мои вопросы:
- Как мне продолжить свой класс пользовательских выражений?
- Есть ли лучший способ, чем расширение PDOStatement?
Обновление: Мои последние выводы:
Я думаю, что проблемным является интерфейс Traversable
. Когда я зацикливаю оператор с foreach()
, большинство переопределенных методов игнорируются. Когда я вызываю вещи в цикле while()
, например ::1010 *
while( $row = $res->fetch() ){
}
... мой пользовательский метод fetch()
работает.
Если я переопределю методы для интерфейса Iterator
(current()
, key()
, next()
...), они никогда не запустятся.