2012-04-01 12 views
9

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

छोटे साहचर्य सरणियों के लिए इसे रोकने के लिए, यह सिर्फ इस तरह कुछ करने के लिए स्वीकार्य है:

$username = $_POST['username']; 
$password = $_POST['password']; 

मैं उन्हें इस उदाहरण के लिए भागने नहीं कर रहा हूँ संभव के रूप में सुव्यवस्थित रूप में सब कुछ रखने के लिए, तो आराम करने के लिए।

तुम भी ऐसा कर सकते हैं:

list($username, $password) = $_POST; 

लेकिन क्या होगा अगर $ _POST सरणी बड़ा है? फिर यह उन दोनों विधियों को करने के लिए थकाऊ हो जाता है। इसे ठीक करने के लिए, आप इस तरह एक लूप चला सकते हैं:

foreach($arr as $key => $value) 
{ 
    ${$key} = $value; 
} 

इस विधि के साथ समस्या यह है कि यह स्थानीय चर निर्दिष्ट करता है। यह अच्छा होगा अगर माता-पिता में एक फ़ंक्शन को कॉल करना संभव था जो इस लूप को चलाता है और उन स्थानीय चर कॉलिंग क्लास के भीतर पहुंच योग्य थे। एक एमवीसी सेटअप की कल्पना करें जहां प्रत्येक नियंत्रक Controller वर्ग से लिया गया है, और इसी तरह मॉडल के लिए भी। यह करने के लिए अच्छा होगा:

$this->localize($_POST); 
doWhatever($username) // $username works! Assuming $_POST['username'] is defined 

बनाना ऐसी पद्धति का कारण बनता है केवल करने के लिए स्थानीय चर माता पिता कक्षा में localize() समारोह के दायरे के भीतर रहते हैं, तो यह काम नहीं करेगा। क्या मैं कर रहे हैं एक संशोधन के साथ ही पाश चल रहा है:

foreach($arr as $key => $value) 
{ 
    $this->{$key} = $value; 
} 

यह काम करता है और सभी, लेकिन वास्तव में प्रारंभिक समस्या का समाधान नहीं है। कोड के बजाय जो ब्रैकेट्स और उद्धरणों के साथ घिरा हुआ है, उसके पास $this-> है, यह उल्लेख करने के लिए नहीं है कि यह उन चरों को असाइन कर रहा है जिन्हें कभी भी कक्षा के भीतर औपचारिक रूप से परिभाषित नहीं किया गया था।

तो अंत में, मेरे सवाल: क्या यह संभव ऐसे localize() मैं वर्णित है, ऐसी है कि वह एक माता पिता के वर्ग से विरासत में मिला जा सकता है के रूप में एक समारोह बनाने लेकिन बच्चे वर्ग ($username$this->username के बजाय) के सापेक्ष स्थानीय चर बनाने के लिए है।

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

उत्तर

17

PHP extract फ़ंक्शन बिल्कुल ठीक करता है।स्थानीय नेम स्पेस में एक हैश अर्क:

http://us3.php.net/extract

एक महत्वपूर्ण परिशिष्ट:

अगर समारोह (जैसे द्वारा प्रदान उपयोगकर्ता के आपूर्ति चर नाम पर काम कर रहा है extract() के लिए EXTR_SKIP विकल्प का उपयोग सुनिश्चित करें $_POST) मौजूदा चर के पुनर्वितरण को रोकने के लिए:

$myvar = 'abc'; 
extract($_POST, EXTR_SKIP); // $_POST['myvar'] won't overwrite $myvar. 
+1

यही वही है जो मुझे चाहिए, धन्यवाद। यदि आप 'EXTR_SKIP' का उपयोग करते हैं तो बहुत सुरक्षित लगता है। यह पागल है कि आप इतने सालों से PHP कैसे कर सकते हैं और इन बुनियादी कार्यों को याद कर सकते हैं ... मुझे मैन्युअल को और अधिक पढ़ने की आवश्यकता है। –

+1

मैं 'निकालने()' के बारे में पता लगाने से पहले 5+ साल के लिए php कोडिंग कर रहा था। बहुत सारे अस्पष्ट अभी तक शक्तिशाली अंतर्निहित कार्य हैं। – leepowers

1

यह एक बुरा अभ्यास है, उपयोगकर्ता POST सरणी में कुंजी पास करके अपने किसी भी चर को फिर से परिभाषित करने में सक्षम होंगे, यह बहुत आसान है और यह रजिस्टर_globals कैसे काम करता है, और यही कारण है कि यह क्षमता 5.3 में हटा दी गई है और 5.4 में हटा दी गई है।

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