PHP में =& ऑपरेटर **रेफरेंस असाइनमेंट (Assignment by Reference)** करता है। यह मान की कॉपी बनाने के बजाय, दोनों वेरिएबल्स को **समान मेमोरी स्थान** पर इंगित करता है। एक में परिवर्तन दूसरे में प्रतिबिंबित होता है।
उदाहरण
<?php $my_val1 = 67; $my_val2 = &$my_val1; // रेफरेंस असाइनमेंट $my_val1 = 89; print "The value is: "; print $my_val2; // 89 प्रिंट होगा ?>
आउटपुट
The value is: 89
क्या हुआ:
$my_val1 = 67— मेमोरी में 67 स्टोर,$my_val1उस ओर इंगित करता है।$my_val2 = &$my_val1—$my_val2**उसी** मेमोरी स्थान की ओर इंगित करता है (कॉपी नहीं)।$my_val1 = 89— उस मेमोरी स्थान का मान 89 हो जाता है।$my_val2पढ़ने पर 89 मिलता है क्योंकि यह उसी स्थान को देखता है।
सामान्य असाइनमेंट (=) बनाम रेफरेंस (=&)
| प्रकार | कोड | व्यवहार |
|---|---|---|
| मान द्वारा (कॉपी) | $b = $a; | $b को $a की **कॉपी** मिलती है। बाद में $a बदलने पर $b अपरिवर्तित रहता है। |
| रेफरेंस द्वारा | $b = &$a; | $b और $a **समान डेटा** साझा करते हैं। किसी भी में परिवर्तन दूसरे में दिखता है। |
व्यावहारिक उपयोग
1. फ़ंक्शन में रेफरेंस द्वारा पास करना
<?php
function modify(&$value) {
$value *= 2;
}
$num = 5;
modify($num);
echo $num; // 10
?>
2. फोरिच में रेफरेंस द्वारा संशोधन
<?php
$arr = [1, 2, 3];
foreach ($arr as &$val) {
$val *= 2;
}
unset($val); // महत्वपूर्ण!
print_r($arr); // [2, 4, 6]
?>
3. ऑब्जेक्ट्स (PHP 5+ में डिफ़ॉल्ट रेफरेंस सेमांटिक्स)
<?php
class Foo { public $val = 1; }
$a = new Foo();
$b = $a; // ऑब्जेक्ट्स डिफ़ॉल्ट रूप से रेफरेंस-जैसे व्यवहार करते हैं
$b->val = 2;
echo $a->val; // 2
?>
सावधानियाँ
- अनइंटेंशनल साइड इफेक्ट्स: रेफरेंस अनपेक्षित बग्स पैदा कर सकते हैं।
- अनसेट करना:
unset($b)केवल रेफरेंस हटाता है, डेटा नहीं (यदि अन्य रेफरेंस मौजूद हैं)। - प्रदर्शन: PHP के कॉपी-ऑन-राइट (COW) तंत्र के कारण, मान द्वारा पास करना अक्सर समान तेज़ होता है जब तक संशोधन न हो।
- PHP 8.1+ में
readonlyप्रॉपर्टीज़: रेफरेंस के साथ असंगत।
सारांश
=& दो वेरिएबल्स को समान zval (PHP का आंतरिक मान कंटेनर) साझा करने के लिए बांधता है। यह डेटा अतिरेक से बचाता है और बड़े डेटा संरचनाओं को कॉपी किए बिना संशोधित करने की अनुमति देता है, लेकिन सावधानीपूर्वक उपयोग की आवश्यकता होती है।