Guardando il Pimple source code ho trovato che memorizza gli oggetti e le loro ID in due diverse matrici:Codice sorgente brufolo: perché memorizzare l'ID oggetto e l'oggetto stesso in matrici diverse?
class Container implements \ArrayAccess
{
private $values = array();
...
private $keys = array();
}
E poi:
public function offsetSet($id, $value)
{
...
$this->values[$id] = $value;
$this->keys[$id] = true;
}
E infine:
public function offsetGet($id)
{
if (!isset($this->keys[$id])) {
throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
}
}
I' Ho anche visto qualcosa di simile nel codice sorgente Phalcon here.
La mia domanda è perché memorizzare la chiave di identificazione oggetto separatamente, perché non solo if (!isset($this->values[$id]))
? È più veloce cercare all'interno di un array? Ho fatto alcuni test e sembra che la velocità di ricerca sia praticamente la stessa.
Tra le altre cose, '$ this-> values [$ id]' può avere un valore di 'NULL', e questo identificherà ancora che esiste, perché' $ this-> keys [$ id] 'è vero –
perché non usare 'array_key_exists'? – cmorrissey
E il codice Phalcon: https://github.com/phalcon/cphalcon/blob/master/phalcon/acl/adapter/memory.zep#L174-L175? –