2011-01-09 4 views
10

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

define ("MY_ARRAY", serialize (array ("key1" => $value1,"key2" => $value2, ..))); 

तो की तरह, परिभाषित निरंतर उपयोग करने के लिए आप कुछ इस तरह कर सकते हैं:

$MY_ARRAY = unserialize (MY_ARRAY) 
print_r ($MY_ARRAY); 

नहीं जानते कि क्या serialize समारोह आप अगर आप धीमी हो जाएगी का एक बहुत को परिभाषित करता है आपके कोड में तुम क्या सोचते हो?

+1

आपको वैश्विक विविधता की क्या आवश्यकता है। शायद एक बेहतर दृष्टिकोण है। – PeeHaa

+2

$ ग्लोबल्स ['MY_ARRAY'] = सरणी(); – dqhendricks

+0

पीहा, मुझे वैश्विक होने की आवश्यकता होगी यदि मैं उसी नामस्थान में किसी वर्ग या फ़ंक्शन के भीतर निरंतर सरणी का उपयोग करना चाहता हूं! – techexpert

उत्तर

6
$GLOBALS['MY_ARRAY'] = array(); 
+0

क्या कोई $__POST ["MY_ARRAY"} या $ _GET ["MY_ARRAY"] के साथ MY_ARRAY को ओवरराइड कर सकता है और इस तरह अपना कोड इंजेक्ट कर सकता है? – techexpert

+0

नहीं, यही कारण है कि सुपर ग्लोबल सरणी का आविष्कार किया गया था। पुराने दिनों में लोग इसे PHP कॉन्फ़िगरेशन में सेट करते थे ताकि पोस्ट वैरिएबल वैश्विक चर बन जाए, जब तक कि उन्हें एहसास न हो कि यह एक हैकर्स सपना था। सुनिश्चित करने के लिए, इसे अपने परीक्षण सर्वर पर आज़माएं और देखें कि क्या होता है। – dqhendricks

+0

$ ग्लोबल $ _POST या $ _GET चर के किसी भी तरीके से संबंधित नहीं है। – dqhendricks

6

क्रमबद्धता और विशेष रूप से unserialization बहुत अजीब है। (दूसरी तरफ यह स्पष्ट नहीं है कि क्यों एक स्क्रिप्टिंग भाषा में स्थिरांक के रूप में सरणी नहीं हो सकती है ...)

लेकिन यह वास्तव में उपयोग पैटर्न पर निर्भर करता है। आम तौर पर आप कॉन्फ़िगरेशन सेटिंग्स को संग्रहीत करने के लिए वैश्विक परिभाषा चाहते हैं। और वैश्विक चर और स्थिर इसके लिए उपयुक्त उपयोग हैं ("ग्लोबल्स बुराई !! 1!" मेम के बावजूद)। लेकिन यह कम से कम रजिस्ट्री वस्तु या सरणी के कुछ प्रकार में सब कुछ फेंक दिया जाए:

class config { 
    var $MY_ARRAY = array("key1"=>...); 
    var $data_dir = "/tmp/"; 
} 

यह config::$MY_ARRAY साथ सरल पहुँच वाक्य रचना देता है। यह काफी स्थिर नहीं है, लेकिन आप इसे आसानी से नकली कर सकते हैं। केवल एक ArrayObject या ArrayAccess का उपयोग करें और इसे केवल पढ़ने के लिए गुण बनाने के लिए इसे लागू करें।

function MY_ARRAY() { 
    return array("key1" => $value1,); 
} 
:

(। offsetSet एक त्रुटि फेंक करें) आप एक वैश्विक सरणी लगातार वैकल्पिक हल चाहते हैं, तो एक और विकल्प (मैं define manual page से इस विचार को चोरी हो गया है) एक निरंतर के एवज में एक समारोह का उपयोग करने के लिए है

एक्सेस फिर से स्थिर नहीं है, लेकिन MY_ARRAY() पर्याप्त है। हालांकि MY_ARRAY()["key1"] के साथ अच्छी सरणी पहुंच पहले PHP 5.3 संभव नहीं है; लेकिन फिर इसे उदाहरण के लिए MY_ARRAY("key1") के साथ फिक्र किया जा सकता है।

+0

मारियो, क्रमशः, धारावाहिकता के साथ गलत क्या हो सकता है? इसके अलावा, न तो समारोह या कक्षा वैश्विक दायरे में जाएगी। – techexpert

+0

@techexpert, वास्तव में serialization के साथ कुछ भी गलत नहीं है। लेकिन 'unserialize (MY_ARRAY)' बहुत लंबा पढ़ता है, और आपको हमेशा अनपॅकिंग के लिए अस्थायी चर की आवश्यकता होती है। इस प्रकार की स्थिरता स्थिरांक तक पहुंचने के उद्देश्य को हरा देती है। आप रजिस्ट्री से इसे प्राप्त करने के लिए 'my_const_array ("NAME")' फ़ंक्शन को भी परिभाषित कर सकते हैं। – mario

+0

मैं वास्तव में सरणी के लिए "परिभाषित" कथन का विकल्प खोजना चाहता था, ताकि आप किसी भी फ़ंक्शन को एक साफ तरीके से पास कर सकें, जैसे: call_function (MY_ARRAY) – techexpert