2010-01-14 8 views
7

यह परीक्षण और प्रतिक्रिया मुझे मिलती है। मुझे लगता है कि यह समस्याग्रस्त हो सकता है और एक त्रुटि या नोटिस फेंकना चाहिए, लेकिन मुझे समझ में नहीं आ रहा है कि सहन क्यों किया जाता है।PHP सरणी रिकर्सन त्रुटि को फेंकना नहीं चाहिए?

<?php 
    $test = array(0 => 'test', 1=> &$test); 
    var_dump($test); 

    // array(2) { [0]=> string(4) "test" [1]=> &array(2) { [0]=> string(4) "test" [1]=> &array(2) { [0]=> string(4) "test" [1]=> *RECURSION* } } } 
?> 
+0

मुझे आश्चर्य है कि आप '$ test' को परिभाषित करने वाले उसी अभिव्यक्ति में '$ test' का संदर्भ दे सकते हैं। '$ test = array ('test'); $ परीक्षण [] = &$test; 'बहुत स्पष्ट है। लेकिन तुम्हारा ... – Gumbo

+0

यह एक असली समस्या नहीं है और मैं भी आश्चर्यचकित था। मैं सिर्फ सरणी के साथ खेल रहा था और एक व्यक्तिगत दुविधा मारा। –

+0

@ गंबो PHP अजीब है। मान मौजूद होने से पहले आप संदर्भ निर्दिष्ट कर सकते हैं: 'x x = & $y; $ y = 5; 'उदाहरण के लिए वैध है,' $ y' पहले कभी परिभाषित नहीं किया गया है। – Paulpro

उत्तर

5

यह सच रिकर्सन है, और *RECURSION* एक वास्तविक त्रुटि संदेश नहीं है। यह समस्याग्रस्त नहीं है, क्योंकि $test सक्रिय रूप से पुनरावर्ती नहीं है, और इस मामले में var_dump थकाऊ स्मृति से पहले रोकने के लिए पर्याप्त स्मार्ट है।

1

मुझे लगता है कि होता है कि इस तरह के एक पाश का पता लगाने के गैर तुच्छ है, और यदि व्यवहार गलत थी तुरंत कार्यावधि में स्पष्ट हो जाएगा।

1

यह समस्याग्रस्त क्यों है? PHP यह पहचानने के लिए पर्याप्त स्मार्ट है कि एक सरणी को दोबारा बुलाया जा रहा है।

वही होता है यदि आप print_r($GLOBALS), मुझे इसमें कोई हानि नहीं दिखाई देती है।

1

आप एक संदर्भ स्थापित कर रहे हैं, यानी एक सूचक है, इसलिए कोई वास्तविक रिकर्सन नहीं है, कोई लूप नहीं है। तो नहीं, यह एक त्रुटि फेंक नहीं चाहिए।

0

वास्तव में *RECURSION* संदेश एक त्रुटि संदेश है, जो स्क्रिप्ट निष्पादन समाप्त होता है। अन्यथा यह स्मृति निष्पादित होने तक इसे निष्पादित करेगा।

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