2011-01-12 11 views
11

संदर्भ द्वारा नए के रिटर्न वैल्यू को असाइन करना PHP 5.3 में deprecated पर संदर्भित किया गया है। इस प्रकार,PHP 5.3 और संदर्भ

$obj =& new Foo(); 

अब E_DEPRECATED त्रुटि फेंकता है।

बहुत सारे विरासत कोड 5.3 के साथ बड़े एप्लिकेशन को अपग्रेड करते समय, इससे बहुत सारी अवांछित सूचनाएं होती हैं।

इस समस्या के संभावित समाधान के रूप में, मैं =& new के = new के सभी उदाहरणों को खोजने और बदलने के लिए नियमित अभिव्यक्ति का उपयोग करने पर विचार कर रहा हूं। उदाहरण के लिए, निम्नलिखित सभी PHP फ़ाइलों मिल जाए, और =& new के सभी उदाहरणों का सफाया होगा:

find ./ -name '*.php' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g' 

निम्नलिखित प्रश्नों के उत्तर के लिए खोज रहे:

  1. यह ठीक काम करेगा? मैं किस संभावित मुद्दे में भाग सकता हूं?
  2. यदि नहीं, तो =& new को = new के साथ प्रतिस्थापित करने वाले कोड के उदाहरण PHP 5.3 में व्यवहार को बदल देंगे।
  3. इस के साथ लोकप्रिय पुस्तकालयों के किसी भी उदाहरण को समस्या का कारण माना जाएगा।
  4. =& new की भारी मात्रा में फ़िक्सिंग के साथ निपटने के लिए आप अन्य विचारों की क्या सलाह देते हैं?

मुझे संदेह है कि यह ठीक काम करेगा, लेकिन किनारे के मामलों की तलाश में जहां मैं परेशानी में भाग सकता हूं। हां, मुझे पता है कि मैं सिर्फ त्रुटि रिपोर्टिंग सेटिंग्स बदल सकता हूं। लेकिन मैं नोटिस छिपाना नहीं चाहता, मैं उन्हें ठीक करना चाहता हूं।

+0

E_DEPRECATED नोटिस की श्रेणी से संबंधित है, त्रुटियों में नहीं। मुझे यकीन नहीं है कि आपको इसे ठीक करने के साथ जल्दी करने की आवश्यकता है (magic_quotes को php 4.2 या तो में बहिष्कृत घोषित किया गया था)। रेगेक्स के लिए: आपको 'new' के बाद '\ b' जोड़ना चाहिए, लेकिन अन्यथा यह एक व्यावहारिक पुनर्लेखन दृष्टिकोण है। लेकिन आप केवल तभी परीक्षण कर सकते हैं जब यह अपेक्षित प्रसंस्करण तर्क को कम कर देता है (हालांकि असंभव)। – mario

+0

@ मारियो E_DEPRECATED बस एक त्रुटि * स्तर * है। इसे किसी भी तरह से संदर्भित करना उचित होगा। \ B हालांकि के साथ अच्छा बिंदु। – mfonda

उत्तर

14

आपकी भावना सही है। यह आम तौर पर ठीक काम करेगा, लेकिन किनारे के मामले हैं जहां यह नहीं है।

=& का उपयोग = साथ इन मतभेदों है:

  • =& दाईं ओर एक संदर्भ उपज बनाने की कोशिश करेंगे; = नहीं होगा - भले ही दाहिने तरफ एक संदर्भ उत्पन्न करने में सक्षम हो, भले ही संदर्भ द्वारा लौटाए गए फ़ंक्शन की तरह।
  • =& वर्ष संदर्भ सेट तोड़ने के लिए और, एक नया एक में छोड़ दिया और सही पक्ष दोनों डाल जबकि = एक ही संदर्भ दाईं ओर के मूल्य के बाईं ओर के रूप में सेट के सभी तत्वों का मूल्य बदल जाएगा ।

पहला अंतर और दूसरा आधा इस मामले में अप्रासंगिक है। असाइनमेंट के बाद, नई ऑब्जेक्ट * के मान के साथ केवल एक चर होगा, और सिंगल-एलिमेंट रेफरेंस सेट्स का कोई मतलब नहीं है। हालांकि, इस तथ्य =& टूट पिछले संदर्भ सेट है कि महत्वपूर्ण है:

<?php 

$g = 4; 
$v =& $g; 
$v = new stdclass(); 
var_dump($g); // object(stdClass)#1 (0) { } 

$g = 4; 
$v =& $g; 
$v =& new stdclass(); 
var_dump($g); // int(4) 

* जब तक शायद निर्माता एक संदर्भ लीक, लेकिन फिर भी अगर यह लीक, $this निर्माता के अंदर एक अलग चर हो सकता है, भले ही वह बताते हैं एक ही वस्तु के लिए। तो मुझे संदेह है कि इस वजह से कोई व्यक्ति व्यवहार अंतर देख सकता है।

+4

+1। लेकिन टाइपो, यह '= &' होना चाहिए, न कि '& ='। – Jonah

+0

@ जोना फिक्स्ड, धन्यवाद! – Artefacto

+0

वाह, शांत सामान। कभी सोचा नहीं होगा कि इससे कोई फर्क पड़ता है। +1 – NikiC

3

हां, आपको =& new को = new के साथ प्रतिस्थापित करने में सक्षम होना चाहिए। ऑब्जेक्ट्स PHP 5.3 में डिफ़ॉल्ट रूप से संदर्भ द्वारा पारित किए जाते हैं, इसलिए कोई व्यवहार नहीं बदलेगा।

+1 उन्हें छिपाने के बजाय नोटिस को ठीक करने के लिए +1।

+0

+1 (अनिवार्य "संदर्भ द्वारा पारित संदर्भ, संदर्भ द्वारा पारित वस्तुओं नहीं" पेडेंट्री यहां जाता है।) – BoltClock

+0

+1 मैं तेज़ी से सीख रहा हूं। – Ish

+0

-1 गलत और अप्रासंगिक। वे अदला-बदली नहीं हैं और कोई भी संदर्भ या मूल्य के आधार पर कुछ भी नहीं (कन्स्ट्रक्टर तर्क को छोड़कर) ... – Artefacto

2

कोई समस्या नहीं होनी चाहिए। सबसे बुरे मामले में यह आपके आवेदन को PHP 4 पर थोड़ा धीमा कर देगा, लेकिन यह निश्चित रूप से कार्यक्षमता को नहीं बदलेगा।

एकमात्र समस्या जिसे आप सैद्धांतिक रूप से चला सकते हैं, यह है कि किसी ने स्ट्रिंग में =& new लिखा था। मुझे पता है, यह बेहद असंभव है, लेकिन यदि आप वास्तव में केवल '=' T_WHITESPACE? '&' T_WHITESPACE? T_NEW के सभी अवसरों को प्रतिस्थापित करना चाहते हैं तो आपको Tokenizer का उपयोग करके ऐसा करना चाहिए।

+0

निश्चित रूप से, लेकिन शायद यह एक अच्छी बात हो सकती है। अगर किसी टिप्पणी में किसी कोड का "उदाहरण उपयोग" होता है, तो रेगेक्स उदाहरण उपयोग को ठीक करेगा। लेकिन मुझे लगता है कि यह बुरा होगा अगर यह एक उदाहरण था कि क्या नहीं करना है :-) – mfonda

+0

वे एक ही बात नहीं हैं। हालांकि स्ट्रिंग में दिखाई देने वाले '= & new' के साथ अच्छा बिंदु। पुराने संदर्भों के टूटने का प्रदर्शन करने के लिए – Artefacto

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