2011-01-12 17 views
72

मैं चेतावनी हो रही है पदावनत किया गया है: Call-time pass-by-reference has been deprecated कोड की निम्न लाइनों के लिए:पीएचपी चेतावनी: कॉल-समय व्यतीत-दर-संदर्भ

function XML() { 
    $this->parser = &xml_parser_create(); 
    xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false); 
    xml_set_object(&$this->parser, &$this); 
    xml_set_element_handler(&$this->parser, 'open','close'); 
    xml_set_character_data_handler(&$this->parser, 'data'); 
} 
function destruct() { 
    xml_parser_free(&$this->parser); 
} 
function & parse(&$data) { 
    $this->document = array(); 
    $this->stack = array(); 
    $this->parent = &$this->document; 
    return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL; 
} 

यह क्या कारण है और यह कैसे तय करने के लिए?

+0

रेफरी: [संदर्भ - क्या इस त्रुटि PHP में क्या मतलब है?] (Http://stackoverflow.com/q/12769982/367456) – hakre

+0

संबंधित मैनुअल पृष्ठ: [संदर्भ द्वारा पासिंग ] (http://php.net/manual/en/language.references.pass.php) – Palec

उत्तर

142

&&$this से हर जगह हटाएं, इसकी आवश्यकता नहीं है। वास्तव में, मुझे लगता है कि आप इस कोड में हर जगह & हटा सकते हैं - इसकी आवश्यकता नहीं है। और "संदर्भ द्वारा" "मूल्य द्वारा":

लांग स्पष्टीकरण

पीएचपी दो तरह से चर पारित करने के लिए अनुमति देता है। सबसे पहले जिस तरह से ("मूल्य द्वारा"), आप उन्हें अन्य दूसरा तरीका ("संदर्भ द्वारा") आप कर सकते हैं संशोधित नहीं कर सकते,:

 function not_modified($x) { $x = $x+1; } 
    function modified(&$x) { $x = $x+1; } 

नोट & संकेत। यदि मैं एक चर पर modified पर कॉल करता हूं, तो इसे संशोधित किया जाएगा, अगर मैं not_modified पर कॉल करता हूं, तो तर्क के मान को वापस करने के बाद यह वही होगा। not_modified(&$x): PHP के

पुराने संस्करण ऐसा करके not_modified साथ modified के व्यवहार अनुकरण करने के लिए अनुमति दी। यह "संदर्भ द्वारा कॉल-टाइम पास" है। इसे बहिष्कृत किया गया है और इसका कभी भी उपयोग नहीं किया जाना चाहिए।

इसके अतिरिक्त, बहुत प्राचीन PHP संस्करणों में (पढ़ें: PHP 4 और इससे पहले), यदि आप ऑब्जेक्ट्स संशोधित करते हैं, तो आपको इसे संदर्भ से पास करना चाहिए, इस प्रकार &$this का उपयोग करना चाहिए। यह अब और न आवश्यक है और न ही सिफारिश की है, के रूप में वस्तु हमेशा जब कार्य करने के लिए पारित कर दिया संशोधित कर रहे हैं, यानी यह काम करता है:

function obj_modified($obj) { $obj->x = $obj->x+1; } 

यह $obj->x को संशोधित करेगा, भले ही यह औपचारिक रूप से "मूल्य से" पारित कर दिया है, लेकिन क्या पारित हो जाता है वस्तु है हैंडल (जैसे जावा, इत्यादि) और ऑब्जेक्ट की कॉपी नहीं, क्योंकि यह PHP 4 में थी।

इसका मतलब है, जब तक कि आप कुछ अजीब नहीं कर रहे हैं, आपको लगभग ऑब्जेक्ट पास करने की आवश्यकता नहीं है (और इस प्रकार $this संदर्भ के अनुसार, यह कॉल-टाइम या अन्यथा हो)। विशेष रूप से, आपके कोड की आवश्यकता नहीं है।

+0

क्या मैं यह भी बता सकता हूं कि ऊपर उल्लिखित त्रुटि दिखाई देगी यदि आप 'call_user_func' 'myfunc' का उपयोग करके फ़ंक्शन को आज़माकर कॉल करते हैं। , और $ param) 'लेकिन अगर आप 'call_user_func_array (' myfunc ', सरणी (और $ param)) का उपयोग नहीं करते हैं। मुझे नहीं पता ** क्यों ** अगर कोई भी प्रकाश डालना चाहता है :) –

+1

@MattFletcher क्योंकि पूर्व कॉल-टाइम संदर्भ वाक्यविन्यास है, जिसे लंबे समय से बहिष्कृत किया गया है।उत्तरार्द्ध सिर्फ एक समारोह में तर्क पारित कर रहा है (जो call_user_func_array होता है) इसलिए इसमें कुछ भी गलत नहीं है। तो हाँ, आप इस बाद के सिंटैक्स का उपयोग कॉल-टाइम संदर्भ के अंडर-द-रडार फॉर्म को करने के लिए कर सकते हैं, या आप कानूनी उद्देश्यों के लिए इसका उपयोग कर सकते हैं - जैसे कि रेफरी वेरिएबल-एर्ग फ़ंक्शन के लिए रैपर बनाना (पीडीओ में पैरामीट्रिज्ड बाइंड्स हो सकता है एक उदाहरण)। अंतर पूर्व है हमेशा कानूनी नहीं है और इसकी आवश्यकता नहीं है, बाद में उपयोग के आधार पर वैध या वैध नहीं हो सकता है। – StasM

+2

'पहला तरीका, आप उन्हें संशोधित कर सकते हैं, अन्य तरीकों से आप अन्य तरीकों से नहीं कर सकते हैं :) –

20

बस अगर आप सोच रहे हैं, तो संदर्भ द्वारा कॉल-टाइम पास एक बहिष्कृत PHP सुविधा है जो PHP ढीली टाइपिंग को बढ़ावा देती है। असल में, यह आपको एक ऐसे फ़ंक्शन में संदर्भ (एक सी पॉइंटर की तरह) पास करने की अनुमति देता है जिसने विशेष रूप से किसी के लिए नहीं पूछा है। यह गोल छेद की समस्या में स्क्वायर पेग के लिए PHP का समाधान है।
आपके मामले में, कभी संदर्भ $this। कक्षा के बाहर, $this का संदर्भ आपको इसकी निजी विधियों और क्षेत्रों तक पहुंचने की अनुमति नहीं देगा।

उदाहरण:

<?php 
function test1($test) {} //This function doesn't want a reference 
function test2(&$test) {} //This function implicitly asks for a reference 

$foo = 'bar'; 
test2($foo); //This function is actually given a reference 
test1(&$foo); //But we can't force a reference on test1 anymore, ERROR 
?> 
+3

"असल में, यह आपको एक ऐसे फ़ंक्शन में संदर्भ (एक सी पॉइंटर की तरह) पास करने की अनुमति देता है, जिसे विशेष रूप से नहीं पूछा गया है एक के लिए।" <- यह अच्छी चीजें है। धन्यवाद। – RobW

+0

बस स्पष्ट होने के लिए, PHP संदर्भ सी पॉइंटर्स की तरह नहीं हैं। यदि आपको एक समानता की आवश्यकता है, तो वे यूनिक्स हार्डलिंक्स की तरह अधिक हैं। – StasM