我使用静态函数来创建PDO对象。
它接受2个参数: 一个字符串和一个包含连接设置的对象(dns,user,pass)。
为了防止不必要地创建具有相同名称的重复PDO连接,我尝试创建一个多键字典来缓存PDO对象。
这是我做的:
include_once('IPDOSettings.php');
class PDOManager
{
private static $connections; // array of connections
public static function getConnection(IPDOSettings $settings, $connection_name = 'default')
{
$dictionary_key = array('name' => $connection_name, 'settings' => $settings);
if(!self::$connections[$dictionary_key])
{
$DBH = new PDO($settings->getDNS(),$settings->getUser(),$settings->getPass());
self::$connections[$dictionary_key] = $DBH;
}
return self::$connections[$dictionary_key];
}
}
然而,经过测试,我收到此错误非法偏移类型。在查找之后,我发现你不能使用对象或数组作为键。
那么无论如何要做我想要实现的目标吗?
答案 0 :(得分:2)
查看SplObjectStorage,它允许您将对象用作密钥。
答案 1 :(得分:2)
我会做这样的事情:
$dictionary_key = $connection_name . $settings->toString();
答案 2 :(得分:2)
不是您的问题的答案,但是您希望PDOManager::getConnection()
使用相同的$connection_name
但不同的设置多次调用吗?您是否需要将设置与db句柄一起存储在缓存中?
如果您只是按名称存储连接,则不会发生此问题:
// my suggestion/idea: use $connection_name as key
$dictionary_key = $connection_name;
if(!self::$connections[$dictionary_key])
{
$DBH = new PDO($settings->getDNS(),$settings->getUser(),$settings->getPass());
self::$connections[$dictionary_key] = $DBH;
}
return self::$connections[$dictionary_key];
修改强>
好吧,如果你不能只使用$connection_name
作为密钥,可以合并$connection_name
并使用spl_object_hash()
来获取密钥:
$dictionary_key = $connection_name . spl_object_hash($settings);
这比e好得多。 G。使用serialize()
获取$settings
对象的字符串表示。