2013-12-17 4 views
8

मैं एक निम्नलिखित कोड का टुकड़ा है:पहली कॉल में कोई E_NOTICE त्रुटि क्यों नहीं है?

error_reporting(E_ALL | E_STRICT); 

    function &getVal() { 
     $data = []; 

     return $data['hey']; 
     //return $whatever; 
    } 

    function getVal2() { 
     $data = []; 

     return $data['hey']; 
    } 

    var_dump(getVal()); // No E_NOTICE error is issued - why? 
    var_dump(getVal2()); // E_NOTICE error is issued. 

और सवाल यह है: क्यों वहाँ पहली कॉल में कोई E_NOTICE त्रुटि है? स्पष्टीकरण सबसे अधिक संभावना है कि एक संदर्भ वापस करने के लिए चर $data['hey'] बनाया गया है। हालांकि, यह अभी भी गलत लगता है कि E12NOTICE त्रुटि जारी न करें जब $data['hey'] (या $whatever, ...) परिभाषित नहीं किया गया है।

+0

आपने स्वयं से सवाल का जवाब दिया। "गलत लगता है" के रूप में ... यह PHP है, है ना? – Jon

+1

ठीक है, आप बिल्कुल सही हैं। समस्या यह है कि, इसे संदर्भित करने की केवल क्रिया द्वारा इसे तुरंत चालू किया गया। संभवतया यह करना है कि हूड के तहत संदर्भ कैसे हैंडल करते हैं, उदाहरण के लिए 'preg_match (' .. ',' .. ', $ match) को कॉल करना; 'निश्चित रूप से' $ match' की शिकायत भी नहीं करनी चाहिए अभी तक, बिंदु इसे भर रहा है। संदर्भ_ द्वारा _return देखें 'मैं चाहता हूं कि आप इस स्थान पर _and alter_ डेटा तक पहुंचें'। जब आप दायरे को बंद कर देते हैं तो वापसी के बाद आप तुरंत उस चर को त्याग देते हैं। मैं यह नहीं कह रहा कि यह बहुत सुंदर है, लेकिन यह है कि यह कैसे है। – Wrikken

उत्तर

0

मुझे लगता है कि यह संदर्भ में PHP और इसकी कमजोरियों से संबंधित है।

जब आप PHP में संदर्भित करते हैं तो बाध्यकारी बनाया जाता है। PHP ऑब्जेक्ट टाइपिंग सख्त नहीं है और php नहीं जानता कि किस प्रकार की ऑब्जेक्ट का संदर्भ दिया गया है कि दुभाषिया मानता है कि ['hey'] ऑब्जेक्ट में मौजूद हो सकता है।

PHP में देर से बाध्यकारी और सख्त टाइपिंग की कमी है। यही कारण है कि ऐसी "अजीब" चीजें कभी-कभी होती हैं।

-3

केवल error_reporting(1) php फ़ाइल के शीर्ष पर उपयोग ...

+0

यह एक बहुत ही संक्षिप्त जवाब है। अधिक स्पष्टीकरण सहायक होगा। –

1

यह व्यवहार

http://www.php.net/manual/en/language.references.whatdo.php#language.references.whatdo.assign

आप, आवंटित गुजरती हैं, या संदर्भ द्वारा एक अपरिभाषित चर वापस करते हैं उम्मीद है, यह बनाया जाएगा।

और कुछ संबंधित "बग":

https://bugs.php.net/bug.php?id=30350

ठीक है, ऐसा लगता है कि तत्व बनाई गई है, क्योंकि हम कुछ है कि अस्तित्व में नहीं है के लिए एक संदर्भ वापस जाने के लिए प्रयास कर रहे हैं।

https://bugs.php.net/bug.php?id=27627

जब आप एक गैर existant सरणी तत्व आप को प्रभावी ढंग से इसे बनाने, इसलिए सरणी में शून्य प्रविष्टियों तक पहुँचने का प्रयास।

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