查看Pimple 源代码,我发现它将对象及其 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]))
?在数组中搜索是否更快?我做了一些测试,似乎搜索速度几乎相同。