如何安全地克隆 PDO 对象?

How to clone PDO object safely?

我尝试使用 $pdo2 = clone $pdo 克隆一个 PDO 实例,但在某些 PHP 版本中出现意外行为:

这是重现问题的代码:

$pdo1 = new \PDO('sqlite::memory:');
$pdo1->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
echo "PDO 1 is OK\n";

$pdo2 = clone $pdo1;
$pdo2->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_WARNING);
echo "PDO 2 is OK\n";

echo $pdo1->getAttribute(\PDO::ATTR_ERRMODE) === $pdo2->getAttribute(\PDO::ATTR_ERRMODE)
    ? "❌ The attribute IS changed\n"
    : "✅ The attribute IS NOT changed\n";

Live demo

有什么方法可以制作 PDO 对象的独立副本,或者至少只复制 dns、用户名和密码?

为什么我需要克隆 PDO 实例:我需要保持 PDO 实例隔离以达到目标:

无法安全地克隆 PDO 对象。你永远不应该有这样的想法,因为它没有意义:

  • 如果您希望另一个实例共享同一个数据库连接,那么它不能按定义隔离。另一个实例可以设置不同的 SQL 模式,启动事务, 关闭连接 毕竟。
  • 如果您希望另一个实例创建另一个数据库连接,那么克隆没有意义 - 只需创建一个新连接即可。

因此,如果您想要一个独立的 PDO 实例,只需创建它即可。