2015-09-09 9 views
6

Pimple source code मैंने पाया कि यह दो अलग अलग सरणियों में वस्तुओं और उनकी आईडी भंडारण है को देखते हुए:पिंपल स्रोत कोड: ऑब्जेक्ट आईडी स्टोर क्यों करें और अलग-अलग सरणी में ऑब्जेक्ट करें?

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)); 
    } 
} 

मैं मैंने फाल्कन स्रोत कोड here में कुछ भी देखा है।

मेरा प्रश्न है कि ऑब्जेक्ट आईडी कुंजी को अलग से स्टोर क्यों करें, क्यों न केवल if (!isset($this->values[$id]))? क्या यह एक सरणी के भीतर खोजना तेज़ है? मैंने कुछ परीक्षण किए और ऐसा लगता है कि खोज की गति काफी समान है।

+2

अन्य चीजों के अलावा, '$ this-> मान [$ id] 'के पास' NULL' का मान हो सकता है, और यह अभी भी पहचान करेगा कि यह मौजूद है, क्योंकि '$ this-> कुंजी [$ id]' सत्य है –

+3

क्यों 'array_key_exists' का उपयोग नहीं करते? – cmorrissey

+0

और फाल्कन कोड के बारे में क्या: https://github.com/phalcon/cphalcon/blob/master/phalcon/acl/adapter/memory.zep#L174-L175? –

उत्तर

1

ठीक है, ऐसा लगता है कि सरणी प्रविष्टि मान null हो सकता है आपको array_key_exists() फ़ंक्शन के साथ मुख्य अस्तित्व की जांच करनी होगी। हालांकि, यह isset() से कई गुना धीमा है, इसलिए अलग-अलग सरणी में कुंजियां isset() का उपयोग करने के लिए संभव बनाती हैं। लेकिन बेहतर तरीका if (isset(...) || array_key_exists(...)) होगा, जो लगभग isset() जितना ही गति है, लेकिन कुंजी ट्रैकिंग (धन्यवाद, @ doydoy44) के लिए अलग सरणी की आवश्यकता को समाप्त करता है।

संबंधित मुद्दे