查看Pimple source code我发现它将对象及其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源代码here中也看到了类似的东西。
我的问题是为什么要单独存储对象ID键,为什么不只是if (!isset($this->values[$id]))
?在数组中搜索更快吗?我做了一些测试,似乎搜索速度差不多。