2010-12-11 16 views
9

मुझे दो अलग-अलग फ़ाइलों में कार्य करना है। उनमें से एक एक सरणी हर बार कहा जाता है के लिए एक नया आइटम जोड़ने चाहिए और .क्या मैं के लिए यह है किया सरणी सुलभ होना चाहिए:PHP में वैश्विक सरणी

function1(){ 

    global $array; 

    $array[] = 'hi'; 

} 

लेकिन यह सिर्फ सरणी में एक आइटम बनाने भले ही मैं इस फोन 4 बार कार्य करें।

+0

ध्यान दें कि [ग्लोबल लगभग हमेशा खराब होते हैं] (http://c2.com/cgi/wiki?GlobalVariablesAreBad)। – outis

उत्तर

11

आपको क्या करना चाहिए।

<?php 

function function1(){ 

    global $array; 

    $array[] = 'hi'; 

} 
function1(); 
function1(); 
function1(); 
print_r($array); 

Test it.

आप शायद एक और समस्या है। कृपया ध्यान दें कि सभी चर के जीवनकाल आपकी स्क्रिप्ट का वर्तमान भाग है। वे लगातार रन में मौजूद नहीं होंगे। इसके लिए आपको सत्र, कुकी, फ़ाइल सिस्टम, डेटाबेस जैसे कुछ प्रकार की दृढ़ता का उपयोग करने की आवश्यकता है।

अधिक जानकारी के लिए अपना पूरा कोड पोस्ट करें।

+0

ठीक है, तो इसके लिए एक सत्र का उपयोग करना बेहतर है। धन्यवाद। –

+2

तो एक ही रन में एकाधिक कॉल नहीं किए गए थे? क्या मुझे सही समस्या का अनुमान लगाया गया? –

+0

हाँ एलिन, फ़ंक्शंस एक नए http अनुरोध पर चलते हैं। उन्होंने उसी रन में कॉल नहीं किया था। यह मेरी गलती थी। –

5

मैं थोड़ा आपके प्रश्न के शब्दों से उलझन में हूँ। जब आप कहते हैं कि "मैं दो अलग अलग फ़ाइलों में कार्य करने के लिए है।" क्या आपका मतलब है कि आपके पास "दो" फ़ंक्शन हैं?

आप दो कार्यों दोनों अपने $ सरणी चर का उपयोग करने की कोशिश कर है, तो आप दोनों कार्यों में global $array; कॉल करने के लिए की आवश्यकता होगी।

इसका कारण यह है कि global थोड़ा भ्रामक है। यह वास्तव में कर रहा है यह स्थानीय क्षेत्र में एक चर के लिए $_GLOBALS के सदस्य को संदर्भ दे रहा है जिसका नाम $ _GLOBALS अनुक्रमणिका जैसा ही है। दूसरे शब्दों में, यदि आप कुछ इस तरह करते हैं:

$variable =& $_GLOBALS['variable']; (assign by reference) 

वास्तविक चर $variable अभी भी समारोह स्तर पर स्कोप वाला है, यह सिर्फ करने के लिए होता है: यह अनिवार्य रूप से यह कहते हुए एक ही बात है

global $variable; 

एक वैश्विक चर का संदर्भ है।

इसका निहितार्थ यह है कि यदि आप प्रत्येक फ़ंक्शन में global $variable परिभाषित नहीं करते हैं, तो आप केवल उस फ़ंक्शन के दायरे में एक नया नया चर बना रहे हैं। जब फ़ंक्शन समाप्त होता है, तो वैरिएबल अनसेट होता है और फ़ंक्शन के भीतर किए गए किसी भी बदलाव को खो दिया जाता है।

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

+0

धन्यवाद, मेरी समस्या अब हल हो गई है। –

+0

को '$ _GLOBALS' के बजाय' $ GLOBALS 'नहीं होना चाहिए –

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