Kan*_* K. 6 php arrays silex pimple
看看Pimple源代码,我发现它将对象及其id存储在两个不同的数组中:
class Container implements \ArrayAccess
{
private $values = array();
...
private $keys = array();
}
Run Code Online (Sandbox Code Playgroud)
然后:
public function offsetSet($id, $value)
{
...
$this->values[$id] = $value;
$this->keys[$id] = true;
}
Run Code Online (Sandbox Code Playgroud)
最后:
public function offsetGet($id)
{
if (!isset($this->keys[$id])) {
throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
}
}
Run Code Online (Sandbox Code Playgroud)
我也看到了在惠尔康源代码类似的东西在这里.
我的问题是为什么要分别存储对象id键,为什么不if (!isset($this->values[$id]))呢?在数组中搜索更快吗?我做了一些测试,似乎搜索速度非常相似.
好吧,看起来当数组条目值可能是时,null您必须使用array_key_exists()函数检查键是否存在。然而,这比 慢几倍isset(),因此将键放在单独的数组中使得可以使用isset(). 但更好的方法是if (isset(...) || array_key_exists(...)),它的速度几乎与 simple 相同isset(),但不需要单独的数组来进行键跟踪(谢谢,@doydoy44)。