खोज…


वाक्य - विन्यास

  • $foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
  • $var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;

टिप्पणियों

संदर्भ द्वारा दो चर निर्दिष्ट करते समय, दोनों चर समान मान को इंगित करते हैं। निम्नलिखित उदाहरण लें:

$foo = 1;
$bar = &$foo;

$foo $bar इशारा नहीं करता है$foo और $bar का एक ही मूल्य के लिए दोनों बिंदु $foo है, जो है 1 । उदाहरण देकर स्पष्ट करने के लिए:

$baz = &$bar;
unset($bar);
$baz++;

अगर हमारे पास रिश्ते के points to एक points to था, तो यह unset() होने के बाद अब टूट जाएगा unset() ; इसके बजाय, $foo और $baz अभी भी उसी मूल्य को इंगित करते हैं, जो 2

संदर्भ द्वारा असाइन करें

यह संदर्भित करने का पहला चरण है। अनिवार्य रूप से जब आप संदर्भ द्वारा निर्दिष्ट करते हैं, तो आप दो चर को समान मान साझा करने की अनुमति देते हैं।

$foo = &$bar;

$foo और $bar यहां बराबर हैं। वे एक-दूसरे की ओर इशारा नहीं करते हैं । वे एक ही स्थान ( "मूल्य" ) की ओर इशारा करते हैं।


आप array() भाषा निर्माण के भीतर संदर्भ द्वारा भी असाइन कर सकते हैं। जबकि कड़ाई से संदर्भ द्वारा असाइनमेंट नहीं किया जा रहा है।

$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);

हालाँकि, नोट , कि सरणियों के अंदर संदर्भ संभावित रूप से खतरनाक हैं। दाईं ओर एक संदर्भ के साथ एक सामान्य (संदर्भ से नहीं) असाइनमेंट करने से बाईं ओर एक संदर्भ में बदल नहीं जाता है, लेकिन इन सामान्य असाइनमेंट में सरणियों के अंदर संदर्भ संरक्षित होते हैं। यह फ़ंक्शन कॉल पर भी लागू होता है जहां सरणी मान द्वारा पारित की जाती है।

संदर्भ द्वारा असाइन करना न केवल चर और सरणियों तक सीमित है, वे कार्यों और सभी "पास-बाय-संदर्भ-संघों" के लिए भी मौजूद हैं।

function incrementArray(&$arr) {
    foreach ($arr as &$val) {
        $val++;
    }
}

function &getArray() {
    static $arr = [1, 2, 3];
    return $arr;
}

incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]

असाइनमेंट फ़ंक्शन परिभाषा में ऊपर की तरह प्रमुख है। आप संदर्भ को केवल मूल्य / चर द्वारा नहीं पास कर सकते हैं । इसलिए bar() में $a की तात्कालिकता।

संदर्भ द्वारा लौटें

कभी-कभी आपके पास समय-समय पर वापसी के संदर्भ में समय आता है।

संदर्भ द्वारा लौटना तब उपयोगी होता है जब आप किसी फ़ंक्शन का उपयोग करके यह जानना चाहते हैं कि किस संदर्भ में एक बाउंड होना चाहिए। प्रदर्शन बढ़ाने के लिए रिटर्न-बाय-रेफरेंस का उपयोग न करें। इंजन अपने आप ही इसे ऑप्टिमाइज़ कर देगा। जब आपके पास ऐसा करने के लिए एक वैध तकनीकी कारण हो तो केवल संदर्भ दें।

संदर्भ द्वारा लौटने के लिए PHP दस्तावेज़ीकरण से लिया गया

संदर्भ द्वारा ले जाने के कई अलग-अलग रूप हैं, जिनमें निम्न उदाहरण शामिल हैं:

function parent(&$var) {
    echo $var;
    $var = "updated";
}

function &child() {
    static $a = "test";
    return $a;
}

parent(child()); // returns "test"
parent(child()); // returns "updated"

संदर्भ द्वारा वापसी केवल फ़ंक्शन संदर्भ तक सीमित नहीं है। आपके पास फ़ंक्शन को स्पष्ट रूप से कॉल करने की क्षमता भी है:

function &myFunction() {
    static $a = 'foo';
    return $a;
}

$bar = &myFunction();
$bar = "updated"
echo myFunction();

आप सीधे किसी फ़ंक्शन कॉल को संदर्भित नहीं कर सकते, इसे दोहन से पहले एक चर को सौंपा जाना चाहिए। यह देखने के लिए कि कैसे काम करता है, बस echo &myFunction(); प्रयास करें echo &myFunction();


टिप्पणियाँ

  • आपको उन दोनों स्थानों पर संदर्भ ( & ) निर्दिष्ट करने की आवश्यकता होती है, जिनका आप उपयोग करने का इरादा रखते हैं। इसका मतलब है, आपके फ़ंक्शन की परिभाषा ( function &myFunction() {... ) और कॉलिंग संदर्भ में ( function callFunction(&$variable) {... या &myFunction(); )।
  • आप केवल संदर्भ द्वारा एक चर वापस कर सकते हैं। इसलिए ऊपर के उदाहरण में $a की तात्कालिकता। इसका मतलब है कि आप एक अभिव्यक्ति वापस नहीं कर सकते हैं, अन्यथा एक E_NOTICE PHP त्रुटि उत्पन्न होगी ( Notice: Only variable references should be returned by reference in ...... )।
  • संदर्भ द्वारा वापसी के वैध उपयोग के मामले हैं, लेकिन मुझे चेतावनी देनी चाहिए कि उन्हें एक ही लक्ष्य को प्राप्त करने के अन्य सभी संभावित विकल्पों की खोज के बाद ही संयम से इस्तेमाल किया जाना चाहिए।

संदर्भ द्वारा पास करें

यह आपको किसी फ़ंक्शन या तत्व के संदर्भ में एक चर पास करने की अनुमति देता है जो आपको मूल चर को संशोधित करने की अनुमति देता है।

पासिंग-रेफरेंस केवल चरों तक सीमित नहीं है, निम्नलिखित को संदर्भ द्वारा भी पास किया जा सकता है:

  • नए कथन, उदाहरण के लिए foo(new SomeClass)
  • फ़ंक्शंस से लौटे संदर्भ

Arrays

"पासिंग-बाय-रेफरेंस" का एक सामान्य उपयोग एक सरणी के भीतर प्रारंभिक मानों को संशोधित करने के लिए नए सरणियों को बनाने या अपने नाम स्थान को लिटाने के बिना है। पासिंग-बाय-रेफरेंस उतना आसान है जितना कि पूर्ववर्ती / a & => &$myElement साथ वेरिएबल को प्रीफ़िक्स करना।

नीचे एक सरणी से एक तत्व का उपयोग करने और बस इसके प्रारंभिक मूल्य में 1 जोड़ने का एक उदाहरण है।

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

अब जब आप $arr भीतर किसी भी तत्व का उपयोग करते हैं, तो मूल तत्व को अपडेट किया जाएगा क्योंकि संदर्भ बढ़ा दिया गया था। आप इसे इसके द्वारा सत्यापित कर सकते हैं:

print_r($arr);

ध्यान दें

जब आप छोरों के संदर्भ में पासिंग का उपयोग करते हैं, तो आपको ध्यान देना चाहिए। उपरोक्त लूप के अंत में, $num अभी भी सरणी के अंतिम तत्व का संदर्भ रखता है। यह पोस्ट लूप असाइन करने से अंतिम सरणी तत्व में हेरफेर समाप्त हो जाएगा! आप यह सुनिश्चित कर सकते हैं कि यह परेशान न हो unset() 'आईएनजी इसे पोस्ट-लूप:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

उपरोक्त यह सुनिश्चित करेगा कि आप किसी भी समस्या में नहीं चलेंगे। इस समस्या से संबंधित समस्याओं का एक उदाहरण StackOverflow पर इस प्रश्न में मौजूद है।


कार्य

गुजर-दर-संदर्भ के लिए एक और आम उपयोग कार्यों के भीतर है। मूल चर को संशोधित करना उतना ही सरल है:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

जिसे मूल प्रति के रूप में echo द्वारा सत्यापित किया जा सकता है।

echo $var;

फ़ंक्शंस के आसपास विभिन्न प्रतिबंध हैं, जैसा कि PHP डॉक्स से नीचे उल्लेखित है:

नोट: फ़ंक्शन कॉल पर कोई संदर्भ संकेत नहीं है - केवल फ़ंक्शन परिभाषाओं पर। अकेले फ़ंक्शन परिभाषाएँ संदर्भ द्वारा तर्क को सही ढंग से पारित करने के लिए पर्याप्त हैं। PHP 5.3.0 के अनुसार, आपको यह कहते हुए एक चेतावनी मिलेगी कि "कॉल-टाइम पास-बाय-रेफरेंस" का उपयोग करते समय पदावनत किया जाता है और आप फू (& $ a);; और PHP 5.4.0 के रूप में, कॉल-टाइम पास-बाय-संदर्भ हटा दिया गया था, इसलिए इसका उपयोग करने से एक घातक त्रुटि बढ़ जाएगी।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow