"वैरिएबल स्कोप" क्या है?
चर के पास एक सीमित "गुंजाइश" है, या "वे स्थान जहां से वे सुलभ हैं"। सिर्फ इसलिए कि आपने $foo = 'bar';
एक बार अपने आवेदन में कहीं लिखा है इसका मतलब यह नहीं है कि आप आवेदन के अंदर हर जगह$foo
से संदर्भित कर सकते हैं । चर का एक निश्चित दायरा होता है जिसके भीतर यह मान्य होता है और उसी दायरे में केवल कोड ही चर तक पहुंच पाता है।$foo
PHP में एक स्कोप कैसे परिभाषित किया जाता है?
बहुत सरल: PHP में फंक्शन स्कोप है । यह एकमात्र प्रकार का स्कोप विभाजक है जो PHP में मौजूद है। किसी फ़ंक्शन के अंदर चर केवल उस फ़ंक्शन के अंदर उपलब्ध होते हैं। फ़ंक्शंस के बाहर वेरिएबल्स फ़ंक्शंस के बाहर कहीं भी उपलब्ध हैं, लेकिन किसी फ़ंक्शन के अंदर नहीं। इसका मतलब है कि PHP में एक विशेष गुंजाइश है: वैश्विक गुंजाइश। किसी भी फ़ंक्शन के बाहर घोषित किया गया कोई भी वैरिएबल इस वैश्विक दायरे में है।
उदाहरण:
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
}
$foo
में है वैश्विक , गुंजाइश $baz
एक में है स्थानीय गुंजाइश अंदर myFunc
। केवल कोड के अंदर myFunc
पहुंच है $baz
। केवल बाहर के कोड myFunc
तक ही पहुँच है $foo
। न ही दूसरे तक पहुंच है:
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
echo $foo; // doesn't work
echo $baz; // works
}
echo $foo; // works
echo $baz; // doesn't work
स्कोप और शामिल फ़ाइलें
फ़ाइल की सीमाएँ अलग-अलग नहीं हैं :
a.php
<?php
$foo = 'bar';
b.php
<?php
include 'a.php';
echo $foo; // works!
include
डी कोड पर समान नियम लागू होते हैं जैसा कि किसी अन्य कोड पर लागू होता है: केवल function
अलग स्कोप। स्कोप के उद्देश्य के लिए, आप कॉपी और पेस्ट कोड जैसी फ़ाइलों को शामिल करने के बारे में सोच सकते हैं:
c.php
<?php
function myFunc() {
include 'a.php';
echo $foo; // works
}
myFunc();
echo $foo; // doesn't work!
उपरोक्त उदाहरण में, a.php
अंदर शामिल किया गया था myFunc
, a.php
केवल अंदर के किसी भी चर में स्थानीय फ़ंक्शन गुंजाइश है। सिर्फ इसलिए कि वे दिखाई देते हैं वैश्विक क्षेत्र में होने के लिए a.php
जरूरी नहीं वे कर रहे हैं, यह वास्तव में जो संदर्भ है कि कोड शामिल किया गया है / में मार डाला पर निर्भर करता है।
कार्यों और कक्षाओं के अंदर के कार्यों के बारे में क्या?
हर नई function
घोषणा एक नए दायरे का परिचय देती है, यह इतना आसान है।
(अनाम) कार्यों के अंदर कार्य करता है
function foo() {
$foo = 'bar';
$bar = function () {
// no access to $foo
$baz = 'baz';
};
// no access to $baz
}
कक्षाएं
$foo = 'foo';
class Bar {
public function baz() {
// no access to $foo
$baz = 'baz';
}
}
// no access to $baz
स्कोप किसके लिए अच्छा है?
टेढ़े मुद्दों से निपटना कष्टप्रद लग सकता है, लेकिन जटिल अनुप्रयोगों को लिखने के लिए सीमित चर गुंजाइश आवश्यक है! यदि आपके द्वारा घोषित किया गया प्रत्येक चर आपके आवेदन के अंदर हर जगह से उपलब्ध होगा, तो आप अपने चर को बिना किसी वास्तविक तरीके के ट्रैक करने के लिए कदम रख सकते हैं कि क्या परिवर्तन होता है। केवल इतने सारे समझदार नाम हैं जो आप अपने चर को दे सकते हैं, आप शायद $name
एक से अधिक स्थानों पर " " चर का उपयोग करना चाहते हैं । यदि आपके ऐप में केवल एक बार ही यह विशिष्ट चर नाम हो सकता है, तो आपको यह सुनिश्चित करने के लिए वास्तव में जटिल नामकरण योजनाओं का सहारा लेना होगा ताकि यह सुनिश्चित हो सके कि आपके चर अद्वितीय हैं और आप गलत चर को गलत कोड से नहीं बदल रहे हैं।
का निरीक्षण करें:
function foo() {
echo $bar;
}
यदि कोई गुंजाइश नहीं थी, तो उपरोक्त कार्य क्या करेगा? कहाँ $bar
से आता है? यह किस राज्य में है? क्या यह भी प्रारंभिक है? क्या आपको हर बार जांच करनी है? यह बनाए रखने योग्य नहीं है। जो हमें लाता है ...
पार की सीमाएँ
सही तरीका: अंदर और बाहर चर चर
function foo($bar) {
echo $bar;
return 42;
}
चर $bar
स्पष्ट रूप से फ़ंक्शन तर्क के रूप में इस दायरे में आ रहा है। इस फ़ंक्शन को देखते हुए यह स्पष्ट है कि मूल्यों की उत्पत्ति कहां से होती है। यह तब स्पष्ट रूप से एक मूल्य देता है। कॉलर को यह जानने का आत्मविश्वास है कि फ़ंक्शन किस चर के साथ काम करेगा और इसके रिटर्न मान कहाँ से आते हैं:
$baz = 'baz';
$blarg = foo($baz);
अनाम कार्यों में चर के दायरे का विस्तार
$foo = 'bar';
$baz = function () use ($foo) {
echo $foo;
};
$baz();
अनाम फ़ंक्शन स्पष्ट रूप $foo
से इसके आसपास के दायरे से शामिल है। ध्यान दें कि यह वैश्विक के समान नहीं है दायरे ।
गलत रास्ता: global
जैसा कि पहले कहा गया है, वैश्विक दायरा कुछ विशेष है, और फ़ंक्शन स्पष्ट रूप से इससे चर आयात कर सकते हैं:
$foo = 'bar';
function baz() {
global $foo;
echo $foo;
$foo = 'baz';
}
यह फ़ंक्शन वैश्विक चर का उपयोग करता है और संशोधित करता है $foo
। यह मत करो! (जब तक आप वास्तव में वास्तव में वास्तव में वास्तव में नहीं जानते कि आप क्या कर रहे हैं, और तब भी: नहीं!)
इस फ़ंक्शन के सभी कॉलर देखता है यह है:
baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!
इस बात का कोई संकेत नहीं है कि इस फ़ंक्शन का कोई दुष्प्रभाव है , फिर भी यह करता है। यह बहुत आसानी से एक उलझी हुई गड़बड़ बन जाता है क्योंकि कुछ कार्य संशोधित होते रहते हैं और कुछ वैश्विक स्थिति की आवश्यकता होती है । आप चाहते हैं कि फंक्शन स्टेटलेस हों , केवल उनके इनपुट्स पर काम करें और परिभाषित आउटपुट लौटें, हालाँकि कई बार आप उन्हें कॉल करते हैं।
आपको किसी भी तरह से वैश्विक गुंजाइश का उपयोग करने से बचना चाहिए; निश्चित रूप से आपको वैश्विक दायरे से बाहर चर को "स्थानीय स्तर पर" खींचना नहीं चाहिए।