为什么要将对象id和对象本身存储在不同的数组中


Pimple source code: Why to store object id and object itself in different arrays?

查看ple源代码,我发现它将对象及其id存储在两个不同的数组中:

class Container implements 'ArrayAccess
{
    private $values = array();
    ...
    private $keys = array();
}

然后:

public function offsetSet($id, $value)
{
    ...
    $this->values[$id] = $value;
    $this->keys[$id] = true;
}

最后:

public function offsetGet($id)
{
    if (!isset($this->keys[$id])) {
        throw new 'InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
    }
}

我在Phalcon的源代码中也看到过类似的东西。

我的问题是为什么要单独存储对象id键,为什么不只是if (!isset($this->values[$id])) ?在数组中搜索是否更快?我做了一些测试,搜索速度似乎是差不多的。

Ok,似乎当数组条目值可能是null时,您必须使用array_key_exists()函数检查键是否存在。但是,这比isset()慢几倍,因此在单独的数组中使用键可以使用isset()。但是更好的方法是if (isset(...) || array_key_exists(...)),它的速度几乎与简单的isset()相同,但消除了对键跟踪的单独数组的需要(谢谢,@doydoy44)。