個人的には、私はあなたのアプローチを取りません。その理由は、あるクラスによって作成されたステートメントオブジェクトが別の無関係なクラスに公開される可能性を望まないためです。さらに、実装クラスごとに、実行する必要のあるさまざまな種類のパラメーターバインディング、データにアクセスする必要のある方法(つまり、すべての行をフェッチする、各行をフェッチする、オブジェクトとしてフェッチするか配列としてフェッチするなど)、クラス固有の方法でエラーを処理する方法など。
私にとって、基本PDOクラスの子の中にこのロジックを含めることによって何も得られません。つまり、実行するのは本当に難しいということです。
$stmt = $this->pdo->query(...)
$data = $stmt->fetchAll();
よりも:
$this->myPDO->query(...);
$data = $this->myPDO->myFetchAll();
この追加クラスを、それを消費するすべてのクラスに不必要に結合する以外に、何が得られますか?実際、ステートメントの相互作用は常にクラス固有であり、基本PDOインスタンスによって提供される唯一の共通機能(DB接続)があります。
そのため、クラス間で共通のPDOインスタンスを自由に渡すことができます。これは、間違いなく良い方法です(つまり、依存性注入)。
提案されたmyPDOクラスに変更を加えるときに、すべての実装クラスを変更する可能性があるのか、それとも、実装クラスがステートメントオブジェクトと対話するためのカスタム手段を必要とするたびにmyPDOクラスを変更するのかについて、真剣に考えてください。
以下の説明に基づいて、最大限の柔軟性を提供するためにPDOStatementを拡張することを検討することをお勧めします。
これは次のようになります。
class myPDOFactory {
public static function getInstance($dsn, $pdo_statement_class = 'myPDOStatement', $pdo_constructor_args = NULL);
$pdo = new PDO($dsn);
if (empty($pdo_statement_class)) {
$pdo_statement_class = 'PDOStatement';
}
if (empty($pdo_constructor_args) || !is_array($pdo_constructor_args)) {
$pdo_constructor_args = array();
}
$config_array = array($pdo_statement_class, $pdo_constructor_args);
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, $config_array);
return $pdo;
}
}
class myPDOStatement extends PDO Statement {
public function __construct(<any custom parameters you may need to have passed - items in $pdo_constructor_args from myPDOFactory class>) {
parent::__construct();
// any special stuff you want to do with any passed parameters here
}
public function fetchAll() {
// override any functionality you desire here
}
public function fetchAllObjects() {
return $this->fetchAll(PDO::FETCH_OBJ);
}
}
class someClassThatNeedsPDO {
protected $pdo = NULL;
public function __construct($pdo) {
if($pdo instanceof PDO) {
$this->pdo = $pdo;
} else {
throw new Exception('Ooops!');
}
}
public function doSomethingWithPDO() {
$stmt = $this->PDO->prepare('SELECT * FROM sometable');
$stmt = execute();
return $stmt->fetchAllObjects();
}
}
使用例:
$pdo = myPDOFactory::getInstance($dsn, 'myPDOStatement', $constructor_args);
$consuming_class = new someClassThatNeedsPDO($pdo);
$object_array = $consuming_class->doSomethingWithPDO();