如何在PHP中创建多键字典?

时间:2010-09-02 18:32:51

标签: php dictionary

我使用静态函数来创建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];
    }

}

然而,经过测试,我收到此错误非法偏移类型。在查找之后,我发现你不能使用对象或数组作为键。

那么无论如何要做我想要实现的目标吗?

3 个答案:

答案 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对象的字符串表示。