Php7 - PHP: किसी फ़ंक्शन के अंदर वैश्विक कोई वैरिएबल नहीं दिखाता है - रूसी में स्टैक ओवरफ्लो। PHP वेरिएबल्स का दायरा. वह सब कुछ जो आप जानना चाहते थे लेकिन किसी फ़ंक्शन के बाहर एक वैश्विक php वैरिएबल प्रिंट करने के लिए कहने से डरते थे

अंतिम अद्यतन: 11/1/2015

वेरिएबल और फ़ंक्शंस का उपयोग करते समय, वेरिएबल स्कोप पर विचार करें। दायरा किसी दिए गए चर की कार्रवाई के दायरे और पहुंच को निर्दिष्ट करता है।

स्थानीय चर

किसी फ़ंक्शन के अंदर स्थानीय चर बनाए जाते हैं। ऐसे वेरिएबल्स को केवल किसी दिए गए फ़ंक्शन के भीतर से ही एक्सेस किया जा सकता है। उदाहरण के लिए:

इस मामले में, get() फ़ंक्शन एक स्थानीय चर $result को परिभाषित करता है। और सामान्य सन्दर्भ से हम इस तक नहीं पहुँच सकते, अर्थात् $a = $result; यह संभव नहीं है क्योंकि $result वेरिएबल का दायरा get() फ़ंक्शन द्वारा सीमित है। इस फ़ंक्शन के बाहर, $result वैरिएबल मौजूद नहीं है।

यही बात फ़ंक्शन पैरामीटर्स पर भी लागू होती है: फ़ंक्शन के बाहर, $lowlimit और $highlimit पैरामीटर भी मौजूद नहीं होते हैं।

एक नियम के रूप में, स्थानीय चर गणना के कुछ मध्यवर्ती परिणामों को संग्रहीत करते हैं, जैसा कि ऊपर दिए गए उदाहरण में है।

स्थैतिक चर

स्थैतिक चर स्थानीय चर के समान हैं। उनमें अंतर यह है कि फ़ंक्शन पूरा होने के बाद उनका मूल्य सहेजा जाता है। हर बार जब फ़ंक्शन को कॉल किया जाता है, तो यह पहले से संग्रहीत मान का उपयोग करता है। उदाहरण के लिए:

यह इंगित करने के लिए कि एक वेरिएबल स्थिर होगा, इसमें स्थिर कीवर्ड जोड़ा जाता है। GetCounter() पर लगातार तीन कॉल के साथ, $counter वैरिएबल एक से बढ़ जाएगा।

यदि $counter वैरिएबल एक नियमित गैर-स्थैतिक वैरिएबल था, तो getCounter() हर बार कॉल किए जाने पर 1 प्रिंट करेगा।

आमतौर पर, स्थैतिक चर का उपयोग विभिन्न काउंटर बनाने के लिए किया जाता है, जैसा कि ऊपर दिए गए उदाहरण में है।

सार्वत्रिक चर

कभी-कभी आप चाहते हैं कि एक वेरिएबल विश्व स्तर पर हर जगह उपलब्ध हो। ऐसे वेरिएबल पूरे प्रोग्राम में कुछ डेटा को सामान्य रूप से संग्रहीत कर सकते हैं। वैश्विक चर को परिभाषित करने के लिए, वैश्विक कीवर्ड का उपयोग करें:1

"; ) getGlobal(); echo $gvar; ?>

GetGlobal() फ़ंक्शन को कॉल करने के बाद, $gvar वेरिएबल को प्रोग्राम के किसी भी भाग से एक्सेस किया जा सकता है।

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

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

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

सशर्त कार्य

हम स्थिति के आधार पर एक फ़ंक्शन बना (परिभाषित, वर्णन) कर सकते हैं। उदाहरण के लिए:

//फ़ंक्शन को 'sayHi' कहा जाता है, इसे कहीं भी कॉल किया जा सकता है /*sayGoodbye फ़ंक्शन को यहां नहीं बुलाया जा सकता है, क्योंकि हमने अभी तक स्थिति की जांच नहीं की है और if कन्स्ट्रक्शन के अंदर नहीं गए हैं*/अगर($लागू करें)( फ़ंक्शन कहता है अलविदा())( गूंज "सभी को अलविदा!
"; } } /*अब हम अलविदा कह सकते हैं*/
"; }

परिणाम:

और इस उदाहरण पर एक नजर डालें:

/*और यदि आप यहां 'अलविदा' कहें तो यही होगा*/अलविदा कहो(); अगर($लागू करें)( फ़ंक्शन कहता है अलविदा())( गूंज "सभी को अलविदा!
"; ) ) फ़ंक्शन कहता हैहाय())(इको "सभी को नमस्कार!
"; }

परिणाम:

वास्तव में, जितना मैं काम कर रहा हूं, मैंने कहीं भी ऐसा कुछ नहीं देखा है, लेकिन आपको भाषा की सभी संभावनाओं को ध्यान में रखना होगा।

नेस्टेड फ़ंक्शन

नेस्टेड फ़ंक्शन किसी अन्य फ़ंक्शन के अंदर घोषित किया गया फ़ंक्शन है। उदाहरण:

/*आप यहां सेगुडबाय को कॉल नहीं कर सकते, क्योंकि यह केवल सेहाई फ़ंक्शन को कॉल करने के बाद ही दिखाई देगा*/नमस्ते कहे(); /*फ़ंक्शन को कॉल करें, नमस्ते कहें, इसे कहीं भी कॉल किया जा सकता है*/ /*अब हम अलविदा कह सकते हैं*/अलविदा कहो(); फ़ंक्शन कहता है हाय ()) (इको "सभी को नमस्कार!
"; फ़ंक्शन सेगुडबाय())(इको "सभी को अलविदा!
"; } }

फिर से, पहले ट्रैवर्सल पर, PHP इंटरप्रेटर खुद को चिह्नित करता है कि उसे 'sayHi' फ़ंक्शन का विवरण मिल गया है, लेकिन यह उसके शरीर के अंदर नहीं जाता है, वह केवल नाम देखता है, और चूंकि दुभाषिया 'sayHi' के शरीर के अंदर नहीं जाता है, तब उसे पता नहीं चलता कि हम किसी अन्य फ़ंक्शन के अंदर क्या परिभाषित कर रहे हैं - अलविदा कहें।

फिर कोड निष्पादित होना शुरू हो जाता है, हम 'sayHi' कहते हैं, PHP दुभाषिया को इसे निष्पादित करने के लिए 'sayHi' फ़ंक्शन के मुख्य भाग में जाना पड़ता है और वहां उसे गलती से किसी अन्य फ़ंक्शन - 'SayGoodbye' का विवरण मिल जाता है, जिसके बाद 'SaeGoodbye' को कहीं भी, कई बार कॉल किया जा सकता है। जैसा आपको पसंद।

लेकिन ऊपर की स्थिति में एक बहुत ही सूक्ष्म बिंदु पर ध्यान देने योग्य है:sayHi फ़ंक्शन एक बार का हो जाता है, क्योंकि अगर हम इसे दोबारा कॉल करते हैं, तो PHP फिर से buyGoodbye फ़ंक्शन की परिभाषा में आ जाएगी, और PHP में आप ऐसा नहीं कर सकते यह - आप फ़ंक्शंस को ओवरराइड नहीं कर सकते। मैंने इसके बारे में और इससे निपटने के तरीके के बारे में पिछले लेख में लिखा था।

PHP में, ऊपर वर्णित तकनीकों का उपयोग बहुत कम किया जाता है; उन्हें अधिक बार देखा जा सकता है, उदाहरण के लिए, जावास्क्रिप्ट में।

परिवर्तनीय दायरा

PHP में बिल्कुल दो स्कोप हैं: वैश्विकऔर स्थानीय. प्रत्येक प्रोग्रामिंग भाषा की संरचना का दायरा अलग-अलग होता है। उदाहरण के लिए, C++ में, सम लूप का अपना (स्थानीय) दायरा होता है। वैसे, PHP में, यह एक वैश्विक दायरा है। लेकिन आज हम बात कर रहे हैं Functions की.

PHP में फ़ंक्शंस का अपना आंतरिक दायरा (स्थानीय) होता है, अर्थात, किसी फ़ंक्शन के अंदर के सभी वेरिएबल केवल इसी फ़ंक्शन के भीतर दिखाई देते हैं।

तो, एक बार फिर: फ़ंक्शन के बाहर की हर चीज़ वैश्विक दायरा है, फ़ंक्शन के अंदर की हर चीज़ स्थानीय दायरा है। उदाहरण:

प्रिय विशेषज्ञों, ध्यान, प्रश्न! अंतिम अनुदेश आउटपुट क्या होगा? प्रतिध्वनि $नाम; ?

जैसा कि आपने स्वयं देखा, हमारे पास 2 चर थे $नाम, एक फ़ंक्शन के अंदर (स्थानीय स्कोप), दूसरा सिर्फ कोड (ग्लोबल स्कोप) में, एक वेरिएबल का अंतिम असाइनमेंट $नामथा $नाम = "रुड सेर्गेई";लेकिन चूंकि वह समारोह के अंदर था इसलिए वहीं रुक गया. वैश्विक दायरे में, अंतिम कार्य था $नाम = "एंड्रे";जिसे हम वास्तव में परिणाम के रूप में देखते हैं।

अर्थात्, दो समान चर, लेकिन अलग-अलग दायरे में वे प्रतिच्छेद नहीं करते हैं और एक-दूसरे को प्रभावित नहीं करते हैं।

मुझे चित्र में दायरा स्पष्ट करने दीजिए:

पहले ट्रैवर्सल के दौरान, दुभाषिया संक्षेप में वैश्विक दायरे को स्कैन करता है, याद रखता है कि वहां कौन से चर और फ़ंक्शन हैं, लेकिन कोड निष्पादित नहीं करता है।

स्थानीय दायरे से वैश्विक चर तक पहुँचना

लेकिन क्या होगा अगर हमें अभी भी किसी फ़ंक्शन से वैश्विक दायरे से उसी $name वैरिएबल को एक्सेस करने की आवश्यकता है, और न केवल इसे एक्सेस करना है, बल्कि इसे बदलना है? इसके लिए 3 मुख्य विकल्प हैं. पहला है कीवर्ड का उपयोग करना वैश्विक:

"; वैश्विक $नाम; /*अब से हमारा तात्पर्य वैश्विक वैरिएबल $name*/ से है$नाम = "रुड सेर्गेई"; ) $नाम = "एंड्रे"; नमस्ते($नाम); प्रतिध्वनि $नाम; // ?

परिणाम:

लेकिन इस पद्धति का एक नुकसान है, क्योंकि हमने वैश्विक चर का उपयोग किया है $नामहमने एक स्थानीय चर खो दिया (ओवरराइट कर दिया)। $नाम.

दूसरा तरीकाउपयोग करना है PHP सुपरग्लोबल ऐरे. PHP स्वयं स्वचालित रूप से हमारे द्वारा वैश्विक दायरे में बनाए गए प्रत्येक वेरिएबल को इस सरणी में रखता है। उदाहरण:

$नाम = "एंड्रे"; //के समान$ग्लोबल्स["नाम"] = "एंड्रे";

इस तरह:

"; $ग्लोबल्स["नाम"] = "रुड सेर्गेई"; ) $नाम = "एंड्रे"; नमस्ते($नाम); प्रतिध्वनि $नाम; // ?

परिणाम कीवर्ड का उपयोग करने जैसा ही है वैश्विक:

केवल इस बार हमने लोकल वेरिएबल यानी वेरिएबल को दोबारा नहीं लिखा $नामफ़ंक्शन के अंदर वही रहता है और बराबर है "आंद्रेई", लेकिन नहीं "रूड सेर्गेई".

संदर्भ द्वारा तर्क पारित करना

तीसरा तरीका- यह पते का स्थानांतरण है ( लिंक) एक चर का, उसका मान नहीं। अन्य प्रोग्रामिंग भाषाओं के विपरीत, PHP में लिंक बहुत सफल नहीं हैं। हालाँकि, मैं आपको किसी फ़ंक्शन के संदर्भ में तर्क पारित करने का एकमात्र सही विकल्प बताऊंगा, जो सामान्य रूप से PHP 5.3 और उच्चतर में समर्थित है। लिंक के साथ काम करने के अन्य तरीके हैं, लेकिन उन्होंने PHP 5.2 और उससे नीचे के संस्करणों में काम किया, परिणामस्वरूप, PHP डेवलपर्स ने स्वयं उन्हें छोड़ने का फैसला किया, इसलिए हम उनके बारे में बात नहीं करेंगे।

तो, PHP 5.3 और उच्चतर में संदर्भ द्वारा एक तर्क को सही ढंग से पारित करना निम्नानुसार किया जाता है:

फ़ंक्शन कहता हैHi(& $name)(

फ़ंक्शन विवरण में ही, हमने एक एम्परसेंड आइकन (&) जोड़ा है - इस आइकन का अर्थ है कि हम वेरिएबल के मान को स्वीकार नहीं करते हैं, बल्कि मेमोरी में इस मान के लिए एक लिंक (पता) स्वीकार करते हैं। PHP में सन्दर्भ आपको एक ही मान की ओर इशारा करते हुए दो वेरिएबल बनाने की अनुमति देते हैं। इसका मतलब यह है कि जब इनमें से एक चर बदलता है, तो दोनों बदल जाते हैं, क्योंकि वे मेमोरी में समान मान को संदर्भित करते हैं।

और अंत में हमारे पास है:

// मान नहीं, बल्कि मान का संदर्भ स्वीकार करेंप्रतिध्वनि "हैलो, ".$नाम।"!
"; $नाम = "रुड सेर्गेई"; ) $नाम = "एंड्रे"; नमस्ते($नाम); प्रतिध्वनि $नाम; // ?

परिणाम:

स्थैतिक चर

निम्नलिखित स्थिति की कल्पना करें: हमें यह गिनने की आवश्यकता है कि हमने कुल मिलाकर कितनी बार नमस्ते कहा। हम यही करने का प्रयास कर रहे हैं:

"; $c++; //काउंटर को 1 से बढ़ाएँ


परिणाम:

चर $सीइसका अर्थ याद नहीं रहता, हर बार इसे नये सिरे से बनाया जाता है। हमें अपना स्थानीय वैरिएबल बनाने की आवश्यकता है $सी Function को Execute करने के बाद उसकी वैल्यू याद रहे, इसके लिए वे एक कीवर्ड का उपयोग करते हैं स्थिर:

// काउंटर, स्थिर बनाया गयाप्रतिध्वनि "हैलो, ".$नाम।"!
"; $c++; //काउंटर को 1 से बढ़ाएँप्रतिध्वनि "अभी नमस्ते कहा"। $सी. " एक बार।


"; ) नमस्ते कहो("रुड सेर्गेई"); नमस्ते कहो("आंद्रेई"); नमस्ते कहो("दिमित्री");

परिणाम:

मान लौटा रहा है

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

परिणाम:

आइए इसे ऐसा बनाएं कि इसे स्क्रीन पर प्रदर्शित करने के बजाय, यह निष्पादन परिणाम लौटाए। ऐसा करने के लिए, रिटर्न कीवर्ड का उपयोग करें:

परिणाम:

अब हम इसे विभिन्न तरीकों से उपयोग कर सकते हैं:

//परिणाम आउटपुट करता हैप्रतिध्वनि"
"; $num = getSquare(5); प्रतिध्वनि $num;

परिणाम:

कृपया ध्यान दें कि कीवर्ड वापस करनान केवल एक मान लौटाता है, बल्कि फ़ंक्शन को पूरी तरह से बाधित करता है, अर्थात, कीवर्ड के नीचे मौजूद सभी कोड वापस करनाकभी पूरा नहीं होगा. दूसरे शब्दों में, कार्यों के लिए रिटर्न की तरह भी काम करता है तोड़नालूप के लिए:

इको "PHP मुझ तक कभी नहीं पहुंचेगा:(";) इको गेटस्क्वेयर(5); //परिणाम आउटपुट करता हैप्रतिध्वनि"
"; $num = getSquare(5); // परिणाम को एक वेरिएबल को सौंपा गयाप्रतिध्वनि $संख्या; // स्क्रीन पर वेरिएबल प्रदर्शित करें

परिणाम:

वह है वापस करना- यह भी फ़ंक्शन से एक निकास है। इसका उपयोग रिटर्न वैल्यू के बिना, केवल आउटपुट के लिए किया जा सकता है।

पुनरावर्ती कार्य

एक पुनरावर्ती फ़ंक्शन एक ऐसा फ़ंक्शन है जो स्वयं को कॉल करता है। रिकर्सन का उपयोग अक्सर नहीं किया जाता है और इसे संसाधन-गहन (धीमा) ऑपरेशन माना जाता है। लेकिन ऐसा होता है कि रिकर्सन का उपयोग करना सबसे स्पष्ट और सरल विकल्प है। उदाहरण:

"; यदि($संख्या< 20){ //ताकि रिकर्सन अंतहीन न हो जाएगिनतीकृपया(++$संख्या); //काउंटप्लीज फ़ंक्शन ने स्वयं को कॉल किया) ) गिनतीकृपया(1);

परिणाम:

यदि आप जानते हैं कि पुनरावृत्ति के बिना कैसे करना है, तो ऐसा करना बेहतर है।

PHP में सशक्त टाइपिंग (प्रकार परिशोधन)

PHP मजबूत टाइपिंग की दिशा में छोटे कदम उठाता है, इसलिए हम पहले से निर्दिष्ट कर सकते हैं कि किसी फ़ंक्शन को किस प्रकार का होना चाहिए (इसे कहा जाता है)। प्रकार-संकेत):

परिणाम:

पकड़ने योग्य घातक त्रुटि: तर्क 1 को countPlease() में पारित किया जाना चाहिए, एक सरणी होनी चाहिए, पूर्णांक दिया गया है, लाइन 7 पर /home/index.php में बुलाया गया है और लाइन 3 पर /home/index.php में परिभाषित किया गया है

त्रुटि हमें बताती है कि फ़ंक्शन एक सरणी प्राप्त करने की अपेक्षा करता है, लेकिन इसके बजाय हम इसे एक संख्या दे रहे हैं। दुर्भाग्य से, अभी हम केवल (सरणी) के प्रकार को निर्दिष्ट कर सकते हैं, और PHP 5.4 के साथ हमने ऐसा विकल्प भी जोड़ा है प्रतिदेय:

प्रतिदेयजाँचता है कि पारित मान को फ़ंक्शन के रूप में बुलाया जा सकता है या नहीं। कॉल करने योग्य या तो स्ट्रिंग वेरिएबल द्वारा निर्दिष्ट फ़ंक्शन का नाम हो सकता है, या ऑब्जेक्ट और कॉल की जाने वाली विधि का नाम हो सकता है। लेकिन हम वस्तुओं और विधियों के बारे में बाद में बात करेंगे (यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक अनुभाग है), लेकिन आप पहले से ही फ़ंक्शंस से परिचित हैं। मैं आपको कार्य का परिणाम नहीं दिखा सकता, क्योंकि मेरे पास वर्तमान में PHP 5.3 है, लेकिन यह होगा:

GetEcho फ़ंक्शन को कॉल किया गया

परिवर्तनीय लंबाई तर्कों का उपयोग करना

और अंत में, एक और बहुत ही कम इस्तेमाल की जाने वाली बारीकियाँ। एक स्थिति की कल्पना करें: हम किसी फ़ंक्शन में तर्क पास करते हैं, हालांकि हमने फ़ंक्शन में उनका वर्णन नहीं किया है, उदाहरण के लिए:

परिणाम:

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

func_num_args()- फ़ंक्शन में दिए गए तर्कों की संख्या लौटाता है
func_get_arg(अनुक्रम संख्या)- तर्कों की सूची से एक तत्व लौटाता है
func_get_args()- फ़ंक्शन तर्कों वाली एक सरणी लौटाता है

"; इको func_get_arg(0) ; ) $age = 22; getEcho("रुड सेर्गेई", $age);

परिणाम:

निष्कर्ष

PHP में फ़ंक्शंस के विषय पर आज का लेख अंतिम है। अब आप इस विषय के संबंध में अपने ज्ञान की संपूर्णता के प्रति आश्वस्त हो सकते हैं और आत्मविश्वास से अपनी आवश्यकताओं के लिए फ़ंक्शन का उपयोग कर सकते हैं।

यदि किसी को इसमें बेहतर होने की इच्छा है, लेकिन यह नहीं पता कि यह कैसे करना है, तो सबसे अच्छा तरीका रेडी-मेड (अंतर्निहित) PHP फ़ंक्शंस लिखना होगा, उदाहरण के लिए, आप अपना स्वयं का काउंट() फ़ंक्शन लिख सकते हैं या कोई अन्य.

ध्यान देने के लिए आप सभी का धन्यवाद और फिर मिलेंगे! यदि कुछ स्पष्ट नहीं है, तो बेझिझक अपने प्रश्न टिप्पणियों में पूछें!

यह ट्यूटोरियल PHP वेरिएबल्स के दायरे को कवर करता है। स्थानीय और वैश्विक दायरे के बीच अंतर को समझाता है, दिखाता है कि किसी फ़ंक्शन के भीतर वैश्विक चर तक कैसे पहुंचें, सुपरग्लोबल्स के साथ कैसे काम करें और स्थिर चर बनाएं।

जब आप PHP सीखना शुरू करते हैं और फ़ंक्शंस और ऑब्जेक्ट्स के साथ काम करना शुरू करते हैं, तो वेरिएबल स्कोप थोड़ा भ्रमित करने वाला होता है। सौभाग्य से, इस संबंध में PHP के नियमों को समझना बहुत आसान है (अन्य प्रोग्रामिंग भाषाओं की तुलना में)।

दायरा क्या है?

चर का दायरा वह संदर्भ है जिसके भीतर चर को परिभाषित किया गया था और जहां इसे एक्सेस किया जा सकता है। PHP के दो परिवर्तनीय दायरे हैं:

  • वैश्विक- वेरिएबल्स को स्क्रिप्ट में कहीं भी एक्सेस किया जा सकता है
  • स्थानीय- वेरिएबल्स को केवल उस फ़ंक्शन के अंदर ही एक्सेस किया जा सकता है जिसमें उन्हें परिभाषित किया गया था

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

वैश्विक दायरे वाले चर को वैश्विक कहा जाता है, और स्थानीय दायरे वाले चर को स्थानीय कहा जाता है।

यहां एक उदाहरण दिया गया है कि वैश्विक और स्थानीय चर कैसे काम करते हैं।

"; )sayHello(); echo "\$globalName का मान: "$globalName"
"; प्रतिध्वनि "\$localName मान: "$localName"
"; ?>

हाय हैरी! $ग्लोबलनाम मान: "ज़ो" $लोकलनाम मान: ""

इस स्क्रिप्ट में हमने दो वेरिएबल बनाए:

  • $वैश्विकनाम- यह वैश्विकचर
  • $स्थानीयनाम- यह स्थानीयएक वेरिएबल जोsayHello() फ़ंक्शन के अंदर बनाया गया है।

वेरिएबल और फ़ंक्शन बनाने के बाद, स्क्रिप्ट सेहेलो() को कॉल करती है, जो "हैलो हैरी!" प्रिंट करती है। . फिर स्क्रिप्ट इको फ़ंक्शन का उपयोग करके दो वेरिएबल्स के मानों को आउटपुट करने का प्रयास करती है। यहाँ क्या होता है:

  • क्योंकि $वैश्विकनामफ़ंक्शन के बाहर बनाया गया था, यह स्क्रिप्ट में कहीं भी उपलब्ध है, इसलिए "ज़ो" आउटपुट है।
  • $स्थानीयनामकेवलsayHello() फ़ंक्शन के अंदर ही उपलब्ध होगा। चूंकि इको अभिव्यक्ति फ़ंक्शन के बाहर है, PHP स्थानीय चर तक पहुंच प्रदान नहीं करता है। इसके बजाय, PHP को उम्मीद है कि कोड $localName नामक एक नया वेरिएबल बनाएगा, जिसमें खाली स्ट्रिंग का डिफ़ॉल्ट मान होगा। यही कारण है कि इको के लिए दूसरी कॉल $localName वेरिएबल के लिए मान "" आउटपुट करती है।

किसी फ़ंक्शन के अंदर वैश्विक चर तक पहुँचना

वैश्विक वैरिएबल तक पहुँचने के लिए कार्य से बाहरबस उसका नाम लिखना ही काफी है. लेकिन एक वैश्विक चर तक पहुँचने के लिए किसी फ़ंक्शन के अंदर, आपको पहले वैश्विक कीवर्ड का उपयोग करके फ़ंक्शन में वेरिएबल को वैश्विक घोषित करना होगा:

फ़ंक्शन myFunction() ( वैश्विक $globalVariable; // वैश्विक चर $globalVariable तक पहुंचें)

यदि आप ऐसा नहीं करते हैं, तो PHP मानता है कि आप एक स्थानीय वैरिएबल बना रहे हैं या उसका उपयोग कर रहे हैं।

यहां एक उदाहरण स्क्रिप्ट है जो किसी फ़ंक्शन के अंदर वैश्विक चर का उपयोग करती है:

"; ग्लोबल $ग्लोबलनाम; इको "हैलो $ग्लोबलनाम!
"; ) नमस्ते कहो(); ?>

निष्पादित होने पर, स्क्रिप्ट आउटपुट करेगी:

हाय हैरी! हेलो ज़ोया!

SayHello() फ़ंक्शन $globalName वैरिएबल को वैश्विक घोषित करने के लिए वैश्विक कीवर्ड का उपयोग करता है। फिर वह वेरिएबल तक पहुंच सकती है और उसका मान ("ज़ो") आउटपुट कर सकती है।

सुपरग्लोबल्स क्या हैं?

PHP में पूर्वनिर्धारित वैश्विक सरणियों का एक विशेष सेट होता है जिसमें विभिन्न जानकारी होती है। ऐसी सारणियों को कहा जाता है सुपरग्लोबल्स,चूँकि वे आंतरिक फ़ंक्शन स्पेस सहित स्क्रिप्ट में कहीं से भी पहुंच योग्य हैं, और उन्हें वैश्विक कीवर्ड का उपयोग करके परिभाषित करने की आवश्यकता नहीं है।

यहां PHP संस्करण 5.3 में उपलब्ध सुपरग्लोबल्स की एक सूची दी गई है:

  • $GLOBALS - स्क्रिप्ट में सभी वैश्विक चरों की सूची (सुपरग्लोबल्स को छोड़कर)
  • $_GET - इसमें GET अनुरोध का उपयोग करके ब्राउज़र द्वारा सबमिट किए गए सभी फॉर्म फ़ील्ड की एक सूची शामिल है
  • $_POST - इसमें POST अनुरोध का उपयोग करके ब्राउज़र द्वारा भेजे गए सभी फॉर्म फ़ील्ड की एक सूची शामिल है
  • $_COOKIE - इसमें ब्राउज़र द्वारा भेजी गई सभी कुकीज़ की एक सूची होती है
  • $_REQUEST - इसमें सभी कुंजी/मूल्य संयोजन शामिल हैं जो $_GET, $_POST, $_COOKIE सरणियों में शामिल हैं
  • $_FILES - इसमें ब्राउज़र द्वारा डाउनलोड की गई सभी फ़ाइलों की एक सूची होती है
  • $_SESSION - आपको वर्तमान ब्राउज़र के लिए सत्र चर संग्रहीत करने और उपयोग करने की अनुमति देता है
  • $_SERVER - इसमें सर्वर के बारे में जानकारी होती है, जैसे निष्पादित होने वाली स्क्रिप्ट का फ़ाइल नाम और ब्राउज़र का आईपी पता।
  • $_ENV - इसमें PHP को दिए गए पर्यावरण चर की एक सूची होती है, जैसे CGI चर।
उदाहरण के लिए, आप स्क्रिप्ट के अनुरोध URL स्ट्रिंग में संलग्न चर के मान प्राप्त करने और उन्हें पृष्ठ पर प्रदर्शित करने के लिए $_GET का उपयोग कर सकते हैं:

यदि आप URL http://www.example.com/script.php?yourName=Fred का उपयोग करके उपरोक्त स्क्रिप्ट चलाते हैं, तो यह आउटपुट होगा:

नमस्ते फ्रेड!

चेतावनी!वास्तविक स्क्रिप्ट में कमजोर सुरक्षा के कारण ऐसे डेटा ट्रांसफर का उपयोग कभी नहीं किया जाना चाहिए। आपको हमेशा डेटा को सत्यापित या फ़िल्टर करना चाहिए।

सुपरग्लोबल $GLOBALS का उपयोग करना बहुत सुविधाजनक है क्योंकि यह आपको ग्लोबल कीवर्ड की आवश्यकता के बिना किसी फ़ंक्शन में वैश्विक चर तक पहुंच व्यवस्थित करने की अनुमति देता है। उदाहरण के लिए:

"; ) सेहेल्लो(); // प्रिंट "हैलो, ज़ोया!" ?>

स्थैतिक चर: वे कहीं आसपास हैं

जब आप किसी फ़ंक्शन के अंदर एक स्थानीय वैरिएबल बनाते हैं, तो यह केवल तब मौजूद होता है जब फ़ंक्शन चल रहा होता है। जब फ़ंक्शन पूरा हो जाता है, तो स्थानीय चर गायब हो जाता है। जब फ़ंक्शन को दोबारा कॉल किया जाता है, तो एक नया स्थानीय वैरिएबल बनाया जाता है।

अधिकांश मामलों में यह बढ़िया काम करता है. इस प्रकार, फ़ंक्शंस स्व-निहित होते हैं और जब भी उन्हें बुलाया जाता है तो वे हमेशा समान कार्य करते हैं।

हालाँकि, ऐसी स्थितियाँ हैं जहाँ एक स्थानीय वैरिएबल बनाना सुविधाजनक होगा जो फ़ंक्शन कॉल के बीच इसके मान को "याद" रखता है। ऐसे चर को स्थैतिक कहा जाता है।

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

फ़ंक्शन myFunction() ( स्थिर $myVariable = 0; )

आइए ऐसी स्थिति पर विचार करें जब स्थैतिक चर का उपयोग करना सुविधाजनक हो। मान लीजिए कि आप एक फ़ंक्शन बनाते हैं, जिसे कॉल करने पर, एक विजेट बनता है और पहले से बनाए गए विजेट्स की संख्या प्रदर्शित होती है। आप स्थानीय चर का उपयोग करके इस तरह कोड लिखने का प्रयास कर सकते हैं:


"; echo createWidget() . " हम पहले ही बना चुके हैं।
"; इको क्रिएटविजेट()। " हम पहले ही बना चुके हैं।>
"; ?>

लेकिन, चूँकि हर बार फ़ंक्शन को कॉल करने पर $numWidgets वैरिएबल बनाया जाता है, हमें निम्नलिखित परिणाम मिलेगा:

हम कुछ विजेट बनाते हैं... हम पहले ही 1 बना चुके हैं। हमने पहले ही 1 बना लिया है। हमने पहले ही 1 बना लिया है।

लेकिन एक स्थिर चर का उपयोग करके, हम मान को एक फ़ंक्शन कॉल से दूसरे में संग्रहीत कर सकते हैं:

"; echo createWidget() . " हम पहले ही बना चुके हैं।
"; echo createWidget() . " हम पहले ही बना चुके हैं।
"; echo createWidget() . " >हम पहले ही बना चुके हैं।
"; ?>

अब स्क्रिप्ट अपेक्षित परिणाम देगी:

हम कुछ विजेट बनाते हैं... हम पहले ही 1 बना चुके हैं। हम पहले ही 2 बना चुके हैं। हम पहले ही 3 बना चुके हैं।

हालाँकि एक स्थिर चर फ़ंक्शन कॉल के बीच अपना मान बरकरार रखता है, यह केवल स्क्रिप्ट चलने के दौरान ही मान्य होता है। एक बार जब स्क्रिप्ट का निष्पादन पूरा हो जाता है, तो सभी स्थिर चर नष्ट हो जाते हैं, जैसे स्थानीय और वैश्विक चर।

बस इतना ही! कृपया अपने PHP दस्तावेज़ को बार-बार देखें।

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

सबसे सही तरीका यह होगा कि ऑपरेशंस के सेट को एक फ़ाइल में उनके अपने नाम के साथ फ़ंक्शंस/क्लास के रूप में रखा जाए, फ़ाइल को शामिल किया जाए (फ़ंक्शंस के बाहर किसी भी रिटर्न स्टेटमेंट के बिना), और फिर फ़ंक्शन को कॉल करें ज़ाहिर तौर सेतर्कों के आवश्यक सेट के साथ।

तो समस्या क्या है?

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

यदि आप वैश्विक दायरे में शामिल करते हैं, तो लैंग वैरिएबल सार्वजनिक (वैश्विक) हो जाएगा और इसका उपयोग संभव हो जाएगा। इसे जांचना आसान है; शामिल फ़ाइल में, किसी भी वेरिएबल को परिभाषित करना शुरू करने से पहले, बस लिखें वैश्विक $चर.

उदाहरण:

"file1.php" शामिल करें; फ़ंक्शन include2() ("file2.php" शामिल करें;)
  • file1.php को वैश्विक दायरे में परिभाषित किया गया है।
  • file2.php को include2 फ़ंक्शन के स्थानीय दायरे में परिभाषित किया गया है।

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

वैश्विक चर के साथ दृष्टिकोण खराब क्यों है?

मुद्दा यह है कि वैश्विक चर वैश्विक स्तर पर हर जगह से दिखाई देते हैं। यह सुविधाजनक है: कोई प्रतिबंध नहीं हैं। दूसरी ओर, यह ट्रैक करना पूरी तरह से असंभव हो जाता है कि डेटा कौन बदलता है। जब पूछा जाता है कि वैश्विक चर ख़राब क्यों हैं तो अनियंत्रित परिवर्तन पहली चीज़ है जो आमतौर पर दिमाग में आती है।

मान लीजिए कि आपके पास एक फ़ंक्शन है जिसका परिणाम वैश्विक चर पर निर्भर करता है। आप इसे कॉल करें, कॉल करें, लेकिन 10 मिनट के बाद फ़ंक्शन गलत परिणाम देना शुरू कर देता है। क्या हुआ है? आख़िरकार, आप इसमें इनपुट के रूप में पैरामीटरों का वही सेट पास कर रहे हैं? हम्म, किसी ने वैश्विक चर का मान बदल दिया... यह कौन हो सकता है? हाँ, कोई भी - आख़िरकार, एक वैश्विक चर सभी के लिए उपलब्ध है..

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

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

क्या आप जानते हैं कि वैश्विक चर के लिए सबसे अच्छा उपसर्ग क्या है?

सबरूटीन (उपयोगकर्ता-परिभाषित फ़ंक्शन) के भीतर परिभाषित चर। वे केवल उस फ़ंक्शन के भीतर ही पहुंच योग्य हैं जिसमें उन्हें परिभाषित किया गया है।

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

यदि उपयोगकर्ता-परिभाषित फ़ंक्शन के मुख्य भाग में आप वैश्विक चर के नाम के समान नाम वाले एक चर का उपयोग करते हैं (उपयोगकर्ता-परिभाषित फ़ंक्शन के बाहर स्थित), तो इस स्थानीय चर का वैश्विक चर से कोई संबंध नहीं होगा। इस स्थिति में, वैश्विक चर के नाम के समान नाम वाला एक स्थानीय चर उपयोगकर्ता-परिभाषित फ़ंक्शन में बनाया जाएगा, लेकिन यह स्थानीय चर केवल इस उपयोगकर्ता-परिभाषित फ़ंक्शन के भीतर ही उपलब्ध होगा।

आइए इस तथ्य को एक विशिष्ट उदाहरण से समझाएँ:

$ए = 100 ;

फ़ंक्शन फ़ंक्शन() (
$a = 70 ;
प्रतिध्वनि"

$ए

" ;
}
समारोह();
प्रतिध्वनि"

$ए

" ;
?>

स्क्रिप्ट पहले 70 और फिर 100 प्रिंट करेगी:

70
100

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

$ए = 1 ;
$बी = 2 ;

फ़ंक्शन योग()
{
वैश्विक $ए, $बी;

$बी = $ए + $बी ;
}

जोड़();
प्रतिध्वनि $बी ;
?>

उपरोक्त स्क्रिप्ट आउटपुट करेगी " 3 ". परिभाषित करने के बाद $एऔर $बीफ़ंक्शन के अंदर जैसे वैश्विकइनमें से किसी भी चर के सभी संदर्भ उनके वैश्विक संस्करण की ओर इशारा करेंगे। उपयोगकर्ता द्वारा परिभाषित कार्यों द्वारा नियंत्रित किए जा सकने वाले वैश्विक चर की संख्या की कोई सीमा नहीं है।

वैश्विक स्कोप वेरिएबल्स तक पहुंचने का दूसरा तरीका एक विशेष PHP-परिभाषित सरणी का उपयोग करना है $ग्लोबल्स. पिछला उदाहरण इस प्रकार पुनः लिखा जा सकता है:

वैश्विक के बजाय $GLOBALS का उपयोग करना:

$ए = 1 ;
$बी = 2 ;

फ़ंक्शन योग()
{
$ग्लोबल्स ["बी" ] = $ग्लोबल्स ["ए" ] + $ग्लोबल्स ["बी" ];
}

जोड़();
प्रतिध्वनि $बी ;
?>

$ग्लोबल्सएक सहयोगी सरणी है जिसकी कुंजी नाम है और जिसका मान वैश्विक चर की सामग्री है। ध्यान दें कि $GLOBALS किसी भी दायरे में मौजूद है, ऐसा इसलिए है क्योंकि यह एक सरणी है। सुपरग्लोबल्स की क्षमताओं को प्रदर्शित करने वाला एक उदाहरण नीचे दिया गया है:

फ़ंक्शन टेस्ट_ग्लोबल()
{
// अधिकांश पूर्वनिर्धारित चर नहीं हैं
// "सुपर" और स्थानीय क्षेत्र में उपलब्ध होना
// फ़ंक्शन दृश्यता के लिए "वैश्विक" निर्दिष्ट करना आवश्यक है।
वैश्विक $HTTP_POST_VARS ;

इको $HTTP_POST_VARS["नाम"];

// सुपरग्लोबल्स किसी भी दायरे में उपलब्ध हैं
// दृश्यता और "वैश्विक" निर्दिष्ट करने की आवश्यकता नहीं है।
// सुपरग्लोबल्स PHP 4.1.0 के बाद से उपलब्ध हैं
इको $_POST ["नाम" ];
}
?>