2012-01-23 17 views
198

क्या इस समस्या को आसानी से ठीक करने का कोई तरीका है या क्या मुझे वास्तव में सभी विरासत कोड को फिर से लिखना होगा?PHP 5.4 कॉल-टाइम पास-बाय-रेफरेंस - आसान फिक्स उपलब्ध है?

PHP Fatal error: Call-time pass-by-reference has been removed in ... on line 30

यह हर जगह होता है क्योंकि चर कोड में संदर्भ के रूप में चरों को पारित किया जाता है।

+0

संबंधित: [PHP चेतावनी: कॉल-टाइम पास-बाय-रेफरेंस को बहिष्कृत कर दिया गया है] (http://stackoverflow.com/q/4665782/2157640) – Palec

उत्तर

314

आपको फ़ंक्शन परिभाषा में संदर्भ द्वारा कॉल को इंगित करना चाहिए, वास्तविक कॉल नहीं। चूंकि PHP ने संस्करण 5.3 में बहिष्करण त्रुटियों को दिखाना शुरू किया, इसलिए मैं कहूंगा कि कोड को फिर से लिखना एक अच्छा विचार होगा।

From the documentation:

There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a); .

उदाहरण के लिए, उपयोग करने के बजाय:

// Wrong way! 
myFunc(&$arg);    # Deprecated pass-by-reference argument 
function myFunc($arg) { } 

उपयोग:

// Right way! 
myFunc($var);    # pass-by-value argument 
function myFunc(&$arg) { } 
+8

बहुत खराब :(- मैं 5.2 से 5.4 तक पोर्ट कर रहा हूं और यह वास्तव में कष्टप्रद है ... – bardiir

+9

बहिष्करण PHP 5.0.0 के बाद से है, उस समय संदर्भ के लिए 'E_COMPILE_WARNING' स्तर त्रुटि दे रहा है: http://www.php.net/manual/en/ini.core.php# ini.allow-call-time-pass-Reference – hakre

+5

मुझे यह त्रुटि थी, लेकिन चर को जोड़ने के लिए और निकालने के लिए आवश्यक है। – Diana

5

पीएचपी और संदर्भ कुछ हद तक unintuitive हैं। यदि सही जगहों पर उचित संदर्भों का उपयोग किया जाता है तो बड़े प्रदर्शन सुधार प्रदान कर सकते हैं या बहुत बदसूरत कामकाज और असामान्य कोड से बच सकते हैं।

निम्नलिखित कोई त्रुटि उत्पन्न करेगा:

function f(&$v){$v = true;} 
f(&$v); 

function f($v){$v = true;} 
f(&$v); 

इनमें से कोई नहीं विफल के रूप में वे नीचे नियमों का पालन करें, लेकिन इसमें कोई शक नहीं हटाया या विरासत भ्रम का एक बहुत रोकने के लिए अक्षम किया गया है हो सकता है।

यदि उन्होंने काम किया है, तो दोनों में संदर्भ में अनावश्यक रूपांतरण शामिल है और दूसरे में एक स्कॉप्ड निहित चर पर वापस एक अनावश्यक रूपांतरण शामिल है।

दूसरा ऐसा संभव था जो संदर्भ को संदर्भित करने के उद्देश्य से कोड को पारित करने की अनुमति देता है। यह रखरखाव के लिए बेहद बदसूरत है।

यह कोई कार्य नहीं करेगा:

function f($v){$v = true;} 
$r = &$v; 
f($r); 

अधिक विशेष रूप से, यह संदर्भ वापस एक सामान्य चर में के रूप में आप एक संदर्भ के लिए नहीं पूछा है बदल जाता है।

यह काम करेगा:

function f(&$v){$v = true;} 
f($v); 

यह देखता है कि आप एक गैर संदर्भ से गुजर रहे हैं लेकिन चाहते हैं एक संदर्भ तो एक संदर्भ में बदल जाता।

इसका क्या अर्थ है कि आप किसी फ़ंक्शन के संदर्भ को पारित नहीं कर सकते हैं, जहां संदर्भ को उन क्षेत्रों में से एक बनाने के लिए स्पष्ट रूप से नहीं पूछा जाता है जहां PHP प्रकार गुजरने पर सख्त है या इस मामले में मेटा प्रकार के अधिक ।

आप और अधिक गतिशील व्यवहार की जरूरत है इस काम करेगा:

function f(&$v){$v = true;} 
$v = array(false,false,false); 
$r = &$v[1]; 
f($r); 

यहाँ यह देखता है कि आप एक संदर्भ चाहते हैं और पहले से ही एक संदर्भ तो यह अकेला छोड़ देता है है। यह संदर्भ भी श्रृंखला कर सकता है लेकिन मुझे शक है।

3

किसी भी व्यक्ति के लिए, जो मुझे पसंद करता है, उसे पढ़ता है क्योंकि उन्हें एक विशाल विरासत परियोजना को 5.6 तक अपडेट करने की आवश्यकता होती है: जैसा कि यहां बताया गया है, कोई त्वरित समाधान नहीं है: आपको वास्तव में समस्या की प्रत्येक घटना को मैन्युअल रूप से ढूंढने की आवश्यकता है , और इसे ठीक करें।

एक परियोजना में सभी समस्याग्रस्त रेखाएं ढूंढने का सबसे सुविधाजनक तरीका (एक पूर्ण उड़ा हुआ स्थिर कोड विश्लेषक का उपयोग करने से कम, जो बहुत सटीक है लेकिन मुझे कोई भी नहीं पता जो आपको सही स्थिति में ले जाता है संपादक तुरंत) विजुअल स्टूडियो कोड का उपयोग कर रहा था, जिसमें एक अच्छा PHP लिंटर बनाया गया है, और इसकी खोज सुविधा जो रेगेक्स द्वारा खोज की अनुमति देती है। (बेशक, आप इस है कि PHP linting और Regex खोज करता है के लिए किसी भी आईडीई/कोड संपादक का उपयोग कर सकते हैं।)

इस regex का उपयोग करना: की घटना के लिए परियोजना में व्यापक खोज करने के लिए

^(?!.*function).*(\&\$) 

यह संभव है &$ केवल उन पंक्तियों में जो फ़ंक्शन परिभाषा नहीं हैं।

यह अभी भी बहुत सारे झूठे सकारात्मक गुणों को बदलता है, लेकिन यह नौकरी को आसान बनाता है।

वीएससीओडी के खोज परिणाम ब्राउज़र चलने और अपमानजनक लाइनों को खोजने में आसान बनाता है: आप बस प्रत्येक परिणाम के माध्यम से क्लिक करते हैं, और उन लोगों के लिए देखो जो लिटर लाल रंग में रेखांकित हैं। जिन्हें आपको ठीक करने की ज़रूरत है।

+1

यह वही है जो मैं ढूंढ रहा था! – Sonny

+1

इस उद्देश्य के लिए मैं अधिक सटीक regex का उपयोग कर रहा हूं: '(? ] [a-zA-Z0-9 _] + (? Mojo

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