2015-09-09 13 views
6

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.

+2

Tra le altre cose, '$ this-> values ​​[$ id]' può avere un valore di 'NULL', e questo identificherà ancora che esiste, perché' $ this-> keys [$ id] 'è vero –

+3

perché non usare 'array_key_exists'? – cmorrissey

+0

E il codice Phalcon: https://github.com/phalcon/cphalcon/blob/master/phalcon/acl/adapter/memory.zep#L174-L175? –

risposta

1

Ok, sembra che quando il valore di ingresso della matrice sia null, è necessario verificare la presenza della chiave con una funzione array_key_exists(). Tuttavia, questo è più volte più lento di isset(), quindi avere le chiavi nell'array separato rende possibile l'uso di isset(). Ma il modo migliore sarebbe if (isset(...) || array_key_exists(...)), che ha quasi la stessa velocità del semplice isset(), ma elimina la necessità di un array separato per il rilevamento delle chiavi (grazie, @ doydoy44).