PHP फंक्शन में ग्लोबल वैरिएबल एक्सेस करें


84

अधिकांश प्रोग्रामिंग लैंग्वेज स्कोप के नियमों के अनुसार, मैं उन चरों को एक्सेस कर सकता हूं जो उनके अंदर फंक्शन्स के बाहर परिभाषित हैं, लेकिन यह कोड काम क्यों नहीं करता है?

<?php
    $data = 'My data';

    function menugen() {
        echo "[" . $data . "]";
    }

    menugen();
?>

आउटपुट है []


3
इसे वैश्विक मत समझो, इसे समारोह में तर्क के रूप में पास करो
मार्क बेकर

2
मैनुअल ऐसी बातें कहां कहता है?
deceze


इस पृष्ठ में दूसरा उदाहरण देखें: php.net/manual/en/language.variables.scope.php
अमीन घोलिबेगियन

afaik हम $ GLOBALS ['varname'] का उपयोग करके पहुंच सकते हैं, जहां इंडेक्स "varname" फ़ंक्शन के बाहर $ varname है। यदि हम सभी वैश्विक चर देखने के लिए print_r ($ GLOBALS) का उपयोग कर सकते हैं।
अहमद

जवाबों:


165

यह काम नहीं कर रहा है क्योंकि आपको यह घोषित करना होगा कि आप किस वैश्विक चर पर पहुँच रहे हैं:

$data = 'My data';

function menugen() {
    global $data; // <-- Add this line

    echo "[" . $data . "]";
}

menugen();

अन्यथा आप इसे एक्सेस कर सकते हैं $GLOBALS['data']चर क्षेत्र देखें ।

भले ही थोड़ा-सा विषय हो, मेरा सुझाव है कि आप ग्लोबल्स का उपयोग करने से बचें और मापदंडों के रूप में गुजरना पसंद करेंगे।


धन्यवाद, आप सही हैं, लेकिन उन्होंने मैनुअल के दूसरे उदाहरण में इस लाइन का उपयोग नहीं किया: php.net/manual/en/language.variables.scope.php
Amin Gholibeigian

6
वास्तव में दूसरा उदाहरण पाठकों को यह दिखाने के लिए था कि क्या नहीं करना है:This script will not produce any output because the echo statement refers to a local version of the $a variable, and it has not been assigned a value within this scope.
मत्तेयो त्सारीरी

2
डांग! मुझे इस उत्तर को अपवोट करने के लिए लॉगिन करना पड़ा क्योंकि मैं creepily php वेरिएबल्स स्कूपिंग को भूल गया था।
मिल्के पैटर

20

आप निम्न में से एक कर सकते हैं:

<?php
    $data = 'My data';

    function menugen() {
        global $data;
        echo "[" . $data . "]";
    }

    menugen();

या

<?php
    $data = 'My data';

    function menugen() {
        echo "[" . $GLOBALS['data'] . "]";
    }

    menugen();

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


13

यह स्कोप की बात है। संक्षेप में, वैश्विक चर बचा जाना चाहिए ताकि :

आपको इसे एक पैरामीटर के रूप में पारित करने की आवश्यकता है:

$data = 'My data';

function menugen($data)
{
    echo $data;
}

या एक कक्षा में है और इसे एक्सेस करें

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}

@MatteoTassinari उत्तर देखें, साथ ही आप इसे एक्सेस करने के लिए वैश्विक के रूप में चिह्नित कर सकते हैं, लेकिन वैश्विक चर आमतौर पर आवश्यक नहीं होते हैं, इसलिए आपके कोडिंग को फिर से सोचने के लिए बुद्धिमान होगा।


और दूसरा तरीका यह है कि आप कीवर्ड को वैश्विक रूप से उपयोग करें (यह सबसे अच्छा तरीका नहीं है)।
जॉचली

1
"मुझे सवाल का जवाब नहीं देना चाहिए, और यह हर मामले के लिए सबसे अच्छा तरीका नहीं हो सकता है।" सरल स्क्रिप्ट के लिए, चारों ओर बदलते मापदंडों और कक्षाओं को जोड़ना क्लंकी है। जावास्क्रिप्ट की तरह, PHP में सब कुछ ऑब्जेक्ट-ओरिएंटेड होने की आवश्यकता नहीं है और वज़ू को नाम दिया गया है।
बीजोर

@Beejor ने यह देखते हुए कि ओपी में एक फ़ंक्शन है, जिसका menugen()अर्थ है कि यह केवल एक मेनू बनाने की तुलना में अधिक होने जा रहा है। उदाहरण के लिए, किसी अन्य स्रोत से अधिक आइटम जोड़ने के लिए उस मेनू का विस्तार करने के बारे में क्या, वर्तमान में चयनित पृष्ठ के चयन के बारे में क्या है। सभी जगह OOP डिजाइन के लिए चिल्लाते हुए यादृच्छिक वैश्विक संस्करण और तर्क। तथ्य यह है कि PHP / JS को संरचित होने की आवश्यकता नहीं है, सबसे बड़ा कारण है जो आपको बहुत सारे गन्दे क्लूनी कोड मिलते हैं। यह बहुत अच्छी तरह से किया जा सकता है, लेकिन लोगों को आगे बढ़ने की स्थिरता के बारे में कोई विचार नहीं करने की अनुमति देता है।
वेबनोब

पीएस डाउन वोटिंग का जवाब भी थोड़ा हटकर है। उत्तर ओपी की समस्या का समाधान प्रदान करता है, सिर्फ इसलिए कि आपको यह पसंद नहीं है, यह गलत नहीं है।
वेबनोब

1
@ बीजर - उस तर्क के साथ समस्या यह है कि लोग सोच सकते हैं कि उन्हें एक वैश्विक चर की आवश्यकता है क्योंकि वे किसी भी बेहतर को नहीं जानते हैं और जब तक उन्हें बताया नहीं जाता है, तब तक उन्हें कोई बेहतर पता नहीं होगा।
वेबनोब

11

इसे करने का दूसरा तरीका:

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();

अद्यतन 2020-01-13: पीटर मोर्टेंसन द्वारा अनुरोध किया गया

PHP 5.3.0 के रूप में हमारे पास अनाम फ़ंक्शन समर्थन हैं जो क्लोजर बना सकते हैं। एक क्लोजर उस वैरिएबल तक पहुंच सकता है जो इसके दायरे से बाहर बना है।

उदाहरण में, क्लोजर एक्सेस करने में सक्षम है $dataक्योंकि यह useक्लॉज़ में घोषित किया गया था ।


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

एक स्पष्टीकरण क्रम में होगा। जैसे, यह "उपयोग" चीज़ क्या करती है? क्या PHP संस्करण इस "उपयोग" बात में समर्थित हैं? (कृपया अपने उत्तर को संपादित करके जवाब दें , यहाँ टिप्पणियों में नहीं (जैसा कि उपयुक्त है) अग्रिम धन्यवाद।)
पीटर मॉर्टेंसन

पता नहीं क्यों स्वीकृत ans Wordpress व्यवस्थापक प्लगइन पृष्ठ में कोई आउटपुट नहीं दिखाता है, लेकिन यह ans अच्छी तरह से काम करता है।
नईमूर हसन

3

कई वर्षों से मैंने हमेशा इस प्रारूप का उपयोग किया है:

<?php
    $data = "Hello";

    function sayHello(){
        echo $GLOBALS["data"];
    }

    sayHello();
?>

मुझे यह सीधा और आसान लगता है। $ GLOBALS यह है कि कैसे PHP आपको एक वैश्विक चर का संदर्भ देता है। यदि आपने $ _SERVER, $ _POST, आदि जैसी चीजों का उपयोग किया है, तो आपके पास यह जानने के बिना एक वैश्विक चर का संदर्भ है।


कौनसा? $GLOBAL(पाठ) या $GLOBALS(नमूना कोड)? (कृपया अपना उत्तर संपादित करके , टिप्पणियों में यहाँ नहीं दें (जैसा कि उचित हो)।)
पीटर मॉर्टेंसन

यह $ GLOBALS है नहीं $ GLOBAL। एक "एस" होना चाहिए। फिर एक सहयोगी सरणी की कुंजी की तरह अपने चर नाम का संदर्भ दें।
भजन कालू '

कृपया यह संपादन करके अपने जवाब को अद्यतन (शुरू करने के लिए संपादन , पर क्लिक करें " संपादित करें " , के बीच "साझा" और "झंडा" उन तीन बाईं तरफ कर रहे हैं -। की बाईं करने के लिए "संपादित" और "जवाब" , इस सवाल का जवाब के बाद स्वयं, इस टिप्पणी के ऊपर, और यहाँ तीनों टिप्पणियों के ऊपर)। टिप्पणियों में जानकारी किसी भी क्षण गायब हो सकती है। यह एक फ़ोरम नहीं है - जानकारी यहाँ अपडेट की जा सकती है (और होनी चाहिए) । वास्तव में अग्रिम धन्यवाद।
पीटर मोर्टेंसन


0
<?php

    $data = 'My data';

    $menugen = function() use ($data) {

        echo "[ $data ]";
    };

    $menugen();
?>

आप सरलीकरण भी कर सकते हैं

echo "[" . $data . "]"

सेवा

echo "[$data]"

echo "[" . $data . "]"और echo "[ $data ]"समान नहीं हैं (बाद के लिए आउटपुट में दो अतिरिक्त स्थान)।
पीटर मोर्टेंसन

0

इस कारण से PHP निराशाजनक हो सकती है। उपयोग करने के ऊपर दिए गए उत्तर globalमेरे काम नहीं आए, और मुझे इसके उचित उपयोग का पता लगाने में थोड़ी देर लगी use

यह सही है:

$functionName = function($stuff) use ($globalVar) {
 //do stuff
}
$output = $functionName($stuff);
$otherOutput = $functionName($otherStuff);

यह गलत है:

function functionName($stuff) use ($globalVar) {
 //do stuff
}
$output = functionName($stuff);
$otherOutput = functionName($otherStuff);

अपने विशिष्ट उदाहरण का उपयोग करना:

    $data = 'My data';

    $menugen = function() use ($data) {
        echo "[" . $data . "]";
    }

    $menugen();

-1

यदि आप चाहें, तो आप "डिफाइन" फ़ंक्शन का उपयोग कर सकते हैं, लेकिन यह फ़ंक्शन एक स्थिरांक बनाता है जिसे एक बार परिभाषित करने के बाद बदला नहीं जा सकता है।

<?php
    define("GREETING", "Welcome to W3Schools.com!");

    function myTest() {
        echo GREETING;
    }

    myTest();
?>

PHP लगातार


यह एक वैश्विक स्थिरांक को परिभाषित करता है, न कि एक चर को।
Beejor

3
एक बार परिभाषित होने के बाद लगातार परिवर्तन नहीं किए जा सकते।
बीजोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.