PHPの`setFetchMode()`の第三引数にクラスを指定すると、そのクラスのプロパティへの自動マッピング機能がありますよね。 マニュアル https://www.php.net/manual/ja/pdostatement.setfetchmode.php この自動マッピング機能を自前で実装するのってアリだと思いますか? 例えば下記 `RowMapper::decorate()` がこの自動マッピングです。 これが `BookRowMapper::select()` の取得に際し実行されることで、`BookRow` クラスのプロパティに取得結果がマッピングされるという流れになります。 ━━━━━━━━━━ abstract class RowMapper { __protected \PDO $pdo; __public function __construct() __{ ____$this->pdo = Database::getInstance('db1'); __} __protected function decorate(\PDOStatement $stmt): \PDOStatement __{ ____try { ______$stmt->setFetchMode(\PDO::FETCH_CLASS|\PDO::FETCH_PROPS_LATE, static::MODEL_CLASS); ______return $stmt; ____} catch (\PDOException $e) { ______throw new \Exception($e->getMessage()); ____} catch (\TypeError $e) { ______throw new \Exception($e->getMessage()); ____} __} } class BookRowMapper extends RowMapper { __const MODEL_CLASS = BookRow::class; __public function select(Row $row) __{ ____$sql = 'INSERT文を $row から生成'; ____$stmt = $this->pdo->query($sql); ____$this->decorate($stmt); ____$stmt->execute(); __} } ━━━━━━━━━━ この自動マッピング機能を自前で実装したいと思ったのです。 自動マッピング機能があるとクラスにプロパティが無いとき `__set()` が走ってしまいますが、`__set()` を使わず全て自前のセッタで全て対処したいなと思っての質問です。 イメージは下記の感じです。 上記の `protected \PDO $pdo;` でなく、下記の `protected CustomPDO $pdo;` を利用し、`setFetchMode()` でなく `setFetchModeCustom()` を利用するという案です。 ━━━━━━━━━━ class CustomPDOStatement extends PDOStatement { __public function setFetchModeCustom($className, $ctorArgs, $properties) __{ ____$this->setFetchMode(PDO::FETCH_CLASS, $className, $ctorArgs); ____// プロパティにマッピング ____foreach ($properties as $property) { ______$this->setColumn($property); ____} __} __protected function setColumn($name) __{ ____// ここで自前の処理 __} } class CustomPDO extends PDO { __public function prepare($sql, $options = null) __{ ____$stmt = parent::prepare($sql, $options); ____$stmt->setFetchModeCustom('CustomClass', null, ['property1', 'property2']); ____return $stmt; __} } ━━━━━━━━━━ うーん、やっぱりナシでしょうか?w ご意見いただければ幸いです。 よろしくお願い致します。
PHP