如何安全地克隆 PDO 对象?
How to clone PDO object safely?
我尝试使用 $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";
有什么方法可以制作 PDO 对象的独立副本,或者至少只复制 dns、用户名和密码?
为什么我需要克隆 PDO 实例:我需要保持 PDO 实例隔离以达到目标:
- 修改保留的实例不会更改原始实例。
- 修改原始实例不会更改保留的实例。
无法安全地克隆 PDO 对象。你永远不应该有这样的想法,因为它没有意义:
- 如果您希望另一个实例共享同一个数据库连接,那么它不能按定义隔离。另一个实例可以设置不同的 SQL 模式,启动事务, 关闭连接 毕竟。
- 如果您希望另一个实例创建另一个数据库连接,那么克隆没有意义 - 只需创建一个新连接即可。
因此,如果您想要一个独立的 PDO 实例,只需创建它即可。
我尝试使用 $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";
有什么方法可以制作 PDO 对象的独立副本,或者至少只复制 dns、用户名和密码?
为什么我需要克隆 PDO 实例:我需要保持 PDO 实例隔离以达到目标:
- 修改保留的实例不会更改原始实例。
- 修改原始实例不会更改保留的实例。
无法安全地克隆 PDO 对象。你永远不应该有这样的想法,因为它没有意义:
- 如果您希望另一个实例共享同一个数据库连接,那么它不能按定义隔离。另一个实例可以设置不同的 SQL 模式,启动事务, 关闭连接 毕竟。
- 如果您希望另一个实例创建另一个数据库连接,那么克隆没有意义 - 只需创建一个新连接即可。
因此,如果您想要一个独立的 PDO 实例,只需创建它即可。