Php में ग्लोबल वैरिएबल कैसे घोषित करें?


168

मेरे पास कोड कुछ इस तरह है:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

क्या वैश्विक चर को एक स्थान पर परिभाषित करने और चर को एक ही बार $aमें सभी कार्यों में सुलभ बनाने का कोई तरीका है ? global $a;अधिक उपयोग किए बिना ?


15
नहीं वहाँ नहीं है। यदि आपको globalकीवर्ड पसंद नहीं है, तो $GLOBALS['a']सभी स्कोप में सुपरग्लोबल का उपयोग करने पर विचार करें, या अपने कार्यों के लिए पैरामीटर पास करने पर विचार करें।
माइकल बर्कोव्स्की

5
यदि यह कुछ महत्वपूर्ण है, तो सत्र सत्र का भी उपयोग किया जा सकता है।
निकोस Tsirakis

जवाबों:


259

इसके $GLOBALSबजाय सरणी का उपयोग किया जा सकता है:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

से मैनुअल :

एक साहचर्य सरणी जिसमें सभी चर के संदर्भ होते हैं जो वर्तमान में स्क्रिप्ट के वैश्विक दायरे में परिभाषित किए जाते हैं। चर नाम सरणी की कुंजी हैं।


यदि आपके पास कुछ सामान्य चर की आवश्यकता वाले कार्यों का एक सेट है, तो गुणों वाला एक वर्ग वैश्विक के बजाय एक अच्छा विकल्प हो सकता है:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

78

यदि परिवर्तनशील परिवर्तन नहीं हो रहा है तो आप इसका उपयोग कर सकते हैं define

उदाहरण:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}

2
जब FOOTER_CONTENTसंशोधित करने का प्रयास किया जाता है तो क्या होता है? क्या यह सिर्फ finalजावा या constसी, सी ++ और सी # में है?
लायन

4
यदि आप दूसरी बार FOOTER_CONTENT को परिभाषित करने का प्रयास करते हैं, तो php इसके बारे में एक सूचना फेंक देगा
Dale

जब भी कोई पृष्ठ लोड होता है, तो मुझे वर्तमान यूनिक्स युग की गणना करने की आवश्यकता होती है, फिर उस मूल्य का उपयोग युगल गणनाओं (कार्यों) में करें। "परिभाषित" मेरे लिए काम किया। प्रारंभ में, मैंने नहीं देखा कि "गूंज FOOTER_CONTENT;" पूर्ववर्ती '$' नहीं था और मुझे त्रुटियाँ मिलीं।
user208145

अगर परिवर्तनशील नहीं है तो परिवर्तनशील नहीं है। है ना ?!
साजिदुर रहमान

29

$ GLOBALS सुपर वैश्विक सरणी में अपने चर जोड़ें

$GLOBALS['variable'] = 'localhost'; 

और इसे विश्व स्तर पर उपयोग करें

या आप निरंतर का उपयोग कर सकते हैं जो पूरी लिपि में सुलभ हैं

define('HOSTNAME', 'localhost');  

1
यदि आप 'डिफाइन' करते हैं, तो एक बार सेट होने पर, आप डिफाइन नहीं बदल सकते हैं!
रेजा एमए

आपके पहले उदाहरण में, यह कह रहा है कि स्क्रिप्ट में बाद में '$ चर' को 'लोकलहोस्ट' कहा जाता है?
Zach Smith

यदि आप इस चर का उपयोग नहीं करना चाहते हैं तो आपको इसका उपयोग $ GLOBALS ['चर'] की तरह करना होगा;
पंकज खैरनार

25

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

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

किसी फ़ंक्शन के बाहर वैश्विक कीवर्ड का उपयोग करना एक त्रुटि नहीं है। यदि आप इस फाइल को किसी फंक्शन के अंदर शामिल करना चाहते हैं तो आप वैरिएबल को घोषित कर सकते हैं global

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

आप भी उपयोग कर सकते हैं $GLOBALS। यह एक सुपरग्लोबल है इसलिए इसकी हर जगह पहुंच है।

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

अपनी पसंद के आधार पर आप या तो चुन सकते हैं।


9

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

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

staticकीवर्ड किसी और वर्ग में मौजूद होना चाहिए $ एक, $ ख वार्स, और $ ग विश्व स्तर पर scoped नहीं किया जाएगा।


यह कई कारणों से एक अच्छा समाधान है। क्लास स्टैटिक को मूल चर नाम में जोड़े गए कुछ वर्णों की आवश्यकता होती है: G :: $ नाम, जहां घोषणा इस तरह दिखती है: वर्ग G {स्थिर $ नाम, $ Name2;} ध्यान दें कि G वास्तव में वैश्विक चर हो सकता है, तब E हो सकता है। कर्मचारियों से संबंधित चरों के लिए उपयोग किया जाता है। यह PHP द्वारा समर्थित पूर्ण पैमाने पर ऑब्जेक्ट-ओरिएंटेड प्रतिमान की तुलना में प्रोग्राम करना आसान है। यदि स्थिरांक की वास्तव में आवश्यकता होती है, तो आप उन्हें "स्थैतिक" के बाद "स्थिर" घोषित किए गए चर की तरह ही घोषित कर सकते हैं - बस डॉलर के संकेतों को छोड़ दें। जी :: उदाहरण एक वैश्विक स्थिरांक का उदाहरण होगा।
डेविड स्पेक्टर

5

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

वैकल्पिक रूप से, किसी वर्ग में एक स्थिरांक के साथ चालें होती हैं, जैसे कि कक्षा :: स्थिरांक जिसका आप उपयोग कर सकते हैं। यदि आप इसे बदलना चाहते हैं, तो स्टैटिक प्रॉपर्टी को सेट करने के लिए फ़ंक्शंस के साथ, क्लास को स्टैटिक प्रॉपर्टीज़ घोषित करके आप उन्हें वेरिएबल भी बना सकते हैं।


5

आप कीवर्ड useको क्लोजर फ़ंक्शंस या लैम्ब्डा में आज़मा सकते हैं, अगर यह आपके इरादे के अनुकूल हो ... PHP 7.0। ऐसा नहीं है कि यह बेहतर है, लेकिन सिर्फ एक विकल्प है।

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

डेमो | जानकारी


1

आइए थोड़ा अलग सोचें:

class globe{
    static $foo = "bar";
}

और आप इसका उपयोग कर सकते हैं और इसे संशोधित कर सकते हैं जैसे आप, जैसे:

function func(){
    echo globe::$foo;
}

0

क्या होगा यदि आप परिवर्तनशील के बजाय प्रक्रियात्मक फ़ंक्शन का उपयोग करते हैं और उन्हें किसी भी स्थान पर कॉल करते हैं जहां आप हैं।

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

function host()
{
   return "localhost";
}

0

$GLOBALS[] है सही समाधान है, लेकिन क्योंकि हम विकल्प के बारे में बात कर रहे हैं, एक समारोह भी आसानी से यह काम कर सकते हैं:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

-19

अब आपको ग्लोबल्स का उपयोग नहीं करना चाहिए, वे PHP 5.4 में उपलब्ध नहीं हैं।


19
रजिस्टर GLOBALS निकाल दिया जाता है। ग्लोबल्स नहीं।
०११ एकता

7
यह उत्तर, जैसा कि लिखा गया है, गलत है और इसे एकता 100 की टिप्पणी को दर्शाने के लिए अद्यतन किया जाना चाहिए। यदि GLOBALS अभी भी उपलब्ध हैं, तो कृपया स्पष्ट करें कि GLOBAL संस्करण के कौन से पहलू बदल गए हैं। कुछ इस तरह।
2828


@RobertColumbia बहुत दिलचस्प पोस्ट है, और मैं इसे अन्य उत्तरों के लिए ध्यान रखूंगा, लेकिन, यह इस विशेष मामले में लागू नहीं होता है। (मुझे आशा है कि आप बस उस मेटा का उपयोग कर रहे हैं कि कैसे एक "ऐसा न करें" उत्तर मान्य हो सकता है और औचित्य नहीं है क्योंकि यह एक है;)) " " ऐसा मत करो " एक वैध उत्तर हो सकता है । "-" हो सकता है "" नहीं "" है। " लेकिन कभी-कभी, इसके बजाय कुछ भी करने की आवश्यकता नहीं है। यदि आप सिर्फ गलत काम करना बंद कर देते हैं, तो सब कुछ जादुई रूप से फिर से काम करना शुरू कर देगा। " - यहां लागू नहीं होता है क्योंकि कोड "टूटा हुआ" नहीं है। ओपी सिर्फ बातें करने का एक "कम टाइपिंग" तरीका चाहता है। …
रॉबिनटेकस

" क्या यह वास्तव में सवाल का जवाब देने का प्रयास है? ज्यादातर मामलों में, यह है। " - "अधिकांश", "सभी" नहीं। (मैं यहां तक ​​कि "सबसे" भी विवाद करूंगा, लेकिन मैंने एक सूचित तर्क बनाने के लिए इस तरह के उत्तर पर्याप्त नहीं देखे हैं।)। " इस मामले में, यह नहीं है। " - और इस "जवाब" में, यह भी नहीं है, बहुत ही कारणों से: " इससे भी बदतर, मर्फी का जवाब समस्या का समाधान प्रस्तावित नहीं करता है। " और " यह नहीं देता है। पूछनेवाला एक उपकरण या एक विधि या कुछ भी उसकी समस्या का समाधान जैसा है । …
रॉबिनटेकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.