能否将PHP类注册为PDO驱动?求可行实现方案
问题
能否通过某种方式将PHP类注册为PDO驱动?具体需求如下:
PDO驱动通过DSN(例如mysql:host=localhost;dbname=test)工作,其中前缀指定使用的驱动,比如示例中的mysql对应pdo_mysql扩展。我想知道能不能从PHP层面注册一个指向自定义类的新驱动?
期望的示例代码(已知PDO::registerDriver方法不存在,仅作演示):
PDO::registerDriver('foo', \Foo::class); print_r(PDO::getAvailableDrivers()); // 期望输出: Array( [0] => mysql, [1] => foo )
注:我了解可以继承并重写PHP的PDO和PDOStatement类,但这并非我的需求。
我曾查看PHP源码中的PDO::getAvailableDrivers函数实现,但不熟悉C/C++。
回答
不能直接从PHP层面注册自定义类作为PDO驱动。
PDO的驱动机制完全基于C扩展实现,PDO::getAvailableDrivers()返回的是编译或动态加载到PHP中的C语言驱动扩展列表,PHP本身没有提供任何API来将纯PHP类注册为PDO驱动——你设想的PDO::registerDriver()这类方法根本不存在,也没有替代方案能实现这个功能。
如果想要实现类似“通过DSN前缀匹配自定义数据库操作类”的效果,只能自己封装一个工厂类模拟该逻辑:
class PDOWrapper { public static function create(string $dsn, string $username = '', string $password = '', array $options = []) { $prefix = substr($dsn, 0, strpos($dsn, ':')); switch ($prefix) { case 'mysql': return new PDO($dsn, $username, $password, $options); case 'foo': return new \Foo($dsn, $username, $password, $options); default: throw new PDOException("Unsupported driver: $prefix"); } } } // 使用示例 $db = PDOWrapper::create('foo:some=option');
但这种方式只是模拟了PDO的DSN用法,并没有真正把foo注册为PDO的可用驱动,PDO::getAvailableDrivers()依然不会返回foo。
内容的提问来源于stack exchange,提问作者oLDo
相关产品推荐
相关产品推荐

