如何在PHP中创建多键词典?
我使用一个静态函数来创建一个PDO对象 它接受2个参数: 一个字符串和一个对象,其中包含连接设置(dns、用户、密码) 为了防止不必要地创建同名的重复PDO连接,我尝试创建一个多键字典来缓存PDO对象 以下是我所做的:如何在PHP中创建多键词典?,php,dictionary,Php,Dictionary,我使用一个静态函数来创建一个PDO对象 它接受2个参数: 一个字符串和一个对象,其中包含连接设置(dns、用户、密码) 为了防止不必要地创建同名的重复PDO连接,我尝试创建一个多键字典来缓存PDO对象 以下是我所做的: include_once('IPDOSettings.php'); class PDOManager { private static $connections; // array of connections public static function g
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];
}
}
但是在测试之后,我得到了这个错误非法的偏移类型。查找后,我发现不能使用对象或数组作为键
那么,还有什么可以做我想要实现的吗?看看,它允许您使用对象作为键。我会这样做:
$dictionary_key = $connection_name . $settings->toString();
这不是您问题的答案,但您是否希望使用相同的
$connection\u name
但不同的设置多次调用PDOManager::getConnection()
?是否需要将设置与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\u name
作为密钥,您可以组合$connection\u name
并使用以获取密钥:
$dictionary_key = $connection_name . spl_object_hash($settings);
这比e好多了。G使用
serialize()
获取$settings
对象的字符串表示形式。只能使用整数和字符串作为键。@NullUserException,对,我现在意识到,这不是我要问的。我想问的是,是否有其他方法可以在不使用数组作为键的情况下实现我想要的功能。显然,您需要在IPDOSettings
对象上编写一个toString函数。实际上,是的,我经常需要连接到多个数据库。因此,到DB1的“默认”连接将覆盖到DB2的“默认”连接。在我尝试使其支持到多个DBs的多个连接之前,您所建议的是我最初要做的。@John Isaack这是一个想法,有时简单的东西是最好的。也许我的编辑给了你另一种方法?事实上,如果我理解正确,使用具有相同设置的单独设置对象(这不应该发生!)将返回相同的字符串(如果序列化),但使用spl_object_hash返回不同的字符串。顺便说一句,我想我可能会一起回到绘图板,因为我认为我把事情复杂化了,如果我能想出一个解决方案,我宁愿不要每次都通过设置。