2012-02-17 13 views
7

PHP 5.4 पर इसका परीक्षण करके "भावी-प्रमाणन" कोड, मुझे एक चेतावनी मिलती है जिसे मैं समझ नहीं पा रहा हूं।मेरी सरणी अनुक्रमणिका किस तरह से 'अवैध स्ट्रिंग ऑफ़सेट' है?

function __clone() { 
    $this->changed = TRUE; 
    foreach ($this->conditions as $key => $condition) { 
    if (
    $condition['field'] 
    instanceOf QueryConditionInterface) { 
     $this->conditions[$key]['field'] = clone($condition['field']); 
    } 
    } 
} 

मैं बाहर $condition['field'] उसकी अपनी पंक्ति में तोड़ दिया पर ध्यान केंद्रित करने के लिए कोड की मात्रा को कम करने के लिए। अवैध स्ट्रिंग DatabaseCondition->__clone()

में 'field' ऑफसेट और मैं सिर्फ नहीं देख सकते हैं कि 'क्षेत्र', एक अवैध स्ट्रिंग ऑफसेट है: कि विशिष्ट लाइन के बारे में, पीएचपी इस

चेतावनी क्या कहना है। मुझे लगता है कि मैं बस कुछ स्पष्ट याद कर रहा हूं, लेकिन यदि समुदाय को कोई समस्या नहीं मिल रही है, तो मैं एक बग रिपोर्ट दर्ज करूंगा।

मैं चेतावनी की व्याख्या करता हूं "किसी भी परिस्थिति में 'फ़ील्ड' वैध कुंजी" नहीं है। यह त्रुटि समझ में आती है अगर मैंने उदाहरण के लिए एक सरणी के रूप में हमारी कोशिश की थी।

+0

कोड समीक्षा कार्य कोड में सुधार के लिए है। चेतावनियों के अर्थ के बारे में विशिष्ट प्रश्न ऑफ-विषय हैं। –

+1

क्या आप 'var_dump ('$ this-> शर्तों') कर सकते हैं;'? –

+0

यह त्रुटि तब भी होती है जब PHP 5.4 के तहत ड्रूपल स्थापित करते हैं http://drupal.org/node/1483986 मुझे विश्वास है कि PHP 5.4 में कुछ टूटा हुआ है, या शायद 'फ़ील्ड' अब एक आरक्षित PHP कीवर्ड है जिसका उपयोग सरणी के लिए नहीं किया जा सकता है, लेकिन मैं एक PHP बग की ओर झुका रहा हूँ। यह बताया गया है कि यह त्रुटि PHP पर पिछले संस्करणों में नहीं होती है। – Brain2000

उत्तर

2

चेतावनी इसकी कहानियों की तरह दिखती है कि $condition एक स्ट्रिंग है। कोड के किसी भी ज्ञान के बिना मैं नहीं जानता कि इससे कोई अर्थ हो।

+0

बह, आप सही हैं। जैसा कि उपरोक्त "माइक पर्ससेल" द्वारा सुझाया गया है, त्रुटि होने पर i var_dump $ स्थितियां होती हैं, और ऐसा लगता है कि यह कभी-कभी एक स्ट्रिंग बन जाता है। – Letharion

3

शर्तों सरणी/पुनरावर्तक के निर्माण के बारे में अधिक जानकारी के बिना, मैं केवल यह मान सकता हूं कि आपको पहले यह जांचना चाहिए कि ऑफसेट मौजूद है या नहीं।

if(isset($condition['field']) && $condition['field'] instanceOf QueryConditionInterface) 

isset का उपयोग करते हुए इस स्थिति में पर्याप्त और array_key_exists की तुलना में तेजी है, फर्क सिर्फ इतना है, अगर $ शर्त [ 'क्षेत्र'] शून्य isset गिर वापस आ जाएगी, array_key_exists सच वापस आ जाएगी, कारण कुंजी मौजूद है। लेकिन क्योंकि आप केवल उन क्षेत्रों पर काम करना चाहते हैं जो QueryConditionInterface का उदाहरण हैं, आप जारी करने के साथ ठीक चलेंगे।

+0

शायद यह मुझे धीमा कर रहा है, लेकिन मुझे नहीं लगता कि यह कैसे लागू होता है? यदि यह 'फ़ील्ड' के बारे में कोई नोटिस नहीं था, तो मुझे समस्या का समाधान करने और समस्या का स्रोत खोजने में कोई समस्या नहीं होती। लेकिन अब, जिस तरह से मैंने त्रुटि पढ़ी है, कोई परिस्थिति नहीं है 'फ़ील्ड' वैध कुंजी_ है; यह मुझे समझ में नहीं आता है। इसे प्रश्न में भी जोड़ा गया। – Letharion

+0

यदि $ शर्त कोई सरणी या सरणी ऑब्जेक्ट कार्यान्वयन नहीं है, तो आप स्ट्रिंग तक पहुंचने का प्रयास कर रहे हैं और आप स्ट्रिंग चार सरणी को स्ट्रिंग के साथ स्ट्रिंग के साथ एक्सेस नहीं कर सकते हैं और अवैध स्ट्रिंग ऑफ़सेट त्रुटि प्राप्त कर सकते हैं, यह त्रुटि देखने के लिए मेरे लिए नया है 5.4 पर ज्यादातर मैं इसे 6.0 शाखा पर देखता हूं ... –

+0

उदाहरण के लिए $ स्थिति का मूल्य 'AND' हो सकता है। – olleolleolle

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