如何安全地克隆PDO对象?

时间:2017-10-25 02:42:53

标签: php pdo clone

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

  • 在PHP≥7中使​​用克隆对象时发生错误。
  • PDO属性链接在HHVM中的原始对象和克隆对象之间。
  • PHP 5中的一切都很好。

以下是重现问题的代码:

$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实例以达到目标:

  • 修改保留的实例不会更改原始实例。
  • 修改原始实例不会更改保留的实例。

1 个答案:

答案 0 :(得分:0)

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

  • 如果您希望其他实例共享相同的数据库连接,则根据定义无法隔离它。另一个实例可以设置不同的SQL模式,启动事务,关闭连接
  • 如果你想让另一个实例创建另一个数据库连接,那么克隆是没有意义的 - 只需创建一个新实例。

因此,如果您想要一个隔离的PDO实例,只需创建它。