PHP
चर स्कोप
खोज…
परिचय
परिवर्तनीय क्षेत्र कोड के क्षेत्रों को संदर्भित करता है जहां एक चर तक पहुँचा जा सकता है। इसे दृश्यता के रूप में भी जाना जाता है। PHP स्कोप ब्लॉक में फ़ंक्शंस, क्लासेस और एक ग्लोबल स्कोप एक एप्लीकेशन में उपलब्ध हैं।
उपयोगकर्ता-परिभाषित वैश्विक चर
किसी भी फंक्शन या क्लास के बाहर का स्कोप ग्लोबल स्कोप है। जब एक PHP स्क्रिप्ट एक और (का उपयोग किया जाना include
या require
) गुंजाइश ही रहता है। यदि किसी स्क्रिप्ट को किसी फ़ंक्शन या वर्ग के बाहर शामिल किया जाता है, तो यह वैश्विक चर समान वैश्विक दायरे में शामिल होता है, लेकिन यदि किसी स्क्रिप्ट को किसी फ़ंक्शन के भीतर से शामिल किया जाता है, तो शामिल स्क्रिप्ट में चर फ़ंक्शन के दायरे में होते हैं।
किसी फ़ंक्शन या क्लास विधि के दायरे के भीतर, global
कीवर्ड का उपयोग एक एक्सेस उपयोगकर्ता-परिभाषित वैश्विक चर बनाने के लिए किया जा सकता है।
<?php
$amount_of_log_calls = 0;
function log_message($message) {
// Accessing global variable from function scope
// requires this explicit statement
global $amount_of_log_calls;
// This change to the global variable is permanent
$amount_of_log_calls += 1;
echo $message;
}
// When in the global scope, regular global variables can be used
// without explicitly stating 'global $variable;'
echo $amount_of_log_calls; // 0
log_message("First log message!");
echo $amount_of_log_calls; // 1
log_message("Second log message!");
echo $amount_of_log_calls; // 2
वैश्विक दायरे से चरों को एक्सेस करने का दूसरा तरीका विशेष PHP-डिफ़ाइंड $ GLOBALS सरणी का उपयोग करना है।
$ GLOBALS सरणी वैश्विक चर के नाम के साथ एक सहयोगी सरणी है जिसमें प्रमुख तत्व है और उस चर की सामग्री सरणी तत्व का मान है। ध्यान दें कि $ GLOBALS किसी भी दायरे में कैसे मौजूद हैं, इसका कारण यह है कि $ GLOBALS एक सुपरग्लोबल है।
इसका मतलब यह है कि log_message()
फ़ंक्शन को फिर से लिखा जा सकता है:
function log_message($message) {
// Access the global $amount_of_log_calls variable via the
// $GLOBALS array. No need for 'global $GLOBALS;', since it
// is a superglobal variable.
$GLOBALS['amount_of_log_calls'] += 1;
echo $messsage;
}
कोई पूछ सकता है, global
कीवर्ड का वैश्विक चर मान प्राप्त करने के लिए global
कीवर्ड का उपयोग करने के लिए $ GLOBALS सरणी का उपयोग क्यों किया जा सकता है? मुख्य कारण global
कीवर्ड का उपयोग कर चर को दायरे में लाया जाएगा। आप फिर स्थानीय स्कोप में समान चर नाम का पुन: उपयोग नहीं कर सकते।
सुपरग्लोबल चर
सुपरग्लोबल चर को PHP द्वारा परिभाषित किया जाता है और इसे हमेशा global
कीवर्ड के बिना कहीं से भी उपयोग किया जा सकता है।
<?php
function getPostValue($key, $default = NULL) {
// $_POST is a superglobal and can be used without
// having to specify 'global $_POST;'
if (isset($_POST[$key])) {
return $_POST[$key];
}
return $default;
}
// retrieves $_POST['username']
echo getPostValue('username');
// retrieves $_POST['email'] and defaults to empty string
echo getPostValue('email', '');
स्थैतिक गुण और चर
public
दृश्यता के साथ परिभाषित स्थिर वर्ग गुण कार्यात्मक रूप से वैश्विक चर के समान हैं। उन्हें कहीं भी परिभाषित किया जा सकता है।
class SomeClass {
public static int $counter = 0;
}
// The static $counter variable can be read/written from anywhere
// and doesn't require an instantiation of the class
SomeClass::$counter += 1;
कार्य अपने स्वयं के दायरे के अंदर स्थिर चर को भी परिभाषित कर सकते हैं। ये स्टैटिक वैरिएबल कई फंक्शन कॉल के माध्यम से बने रहते हैं, एक फंक्शन स्कोप में परिभाषित नियमित वेरिएबल्स के विपरीत। यह सिंगलटन डिज़ाइन पैटर्न को लागू करने का एक बहुत आसान और सरल तरीका हो सकता है:
class Singleton {
public static function getInstance() {
// Static variable $instance is not deleted when the function ends
static $instance;
// Second call to this function will not get into the if-statement,
// Because an instance of Singleton is now stored in the $instance
// variable and is persisted through multiple calls
if (!$instance) {
// First call to this function will reach this line,
// because the $instance has only been declared, not initialized
$instance = new Singleton();
}
return $instance;
}
}
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();
// Comparing objects with the '===' operator checks whether they are
// the same instance. Will print 'true', because the static $instance
// variable in the getInstance() method is persisted through multiple calls
var_dump($instance1 === $instance2);