एक एम्परसेंड के साथ PHP फ़ंक्शन शुरू करने का क्या मतलब है?


129

मैं इसमें इस कोड के साथ फेसबुक लाइब्रेरी का उपयोग कर रहा हूं:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

फ़ंक्शन परिभाषा की शुरुआत में और क्या होता है, और मैं इस तरह से एक पुस्तकालय का उपयोग करने के बारे में कैसे (एक सरल उदाहरण में)

जवाबों:


157

फ़ंक्शन नाम से पहले एक एम्पर्सैंड का अर्थ है फ़ंक्शन मान के बजाय एक चर के संदर्भ को वापस कर देगा।

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

रिटर्निंग संदर्भ देखें ।


1
तो, बहुत विस्तार में जाने के बिना, आप कॉल करेंगे (वर्ग त्वरित के साथ) $ परिणाम जैसा कुछ = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? मुझे लगता है कि मैं यहाँ बारीकियों के बारे में निश्चित नहीं हूँ, हालांकि मदद के लिए धन्यवाद।
एलेक्स मैक नप

2
हां - मैं बस इसे ऐसे ही कहूंगा।
डोमिनिक रॉगर

16

यह एक संदर्भ लौटा रहा है, जैसा कि पहले ही उल्लेख किया गया है। PHP 4 में, वस्तुओं को किसी अन्य मूल्य की तरह, मूल्य द्वारा असाइन किया गया था। यह अत्यधिक अनपेक्षित और इसके विपरीत है कि अधिकांश अन्य भाषाएं कैसे काम करती हैं।

समस्या के चारों ओर जाने के लिए, संदर्भों का उपयोग उन चर के लिए किया जाता था जो वस्तुओं की ओर इशारा करते थे। PHP 5 में, संदर्भ बहुत कम उपयोग किए जाते हैं। मुझे लग रहा है कि यह विरासत कोड या कोड है जो PHP 4 के साथ पीछे की संगतता को संरक्षित करने की कोशिश कर रहा है।


यह आधिकारिक फेसबुक पीएचपी लाइब्रेरी, एफडब्ल्यूआईडब्ल्यू है।
एलेक्स मैक पीपी

4
@ एलेक्स: उस मामले में, वे शायद यह कर रहे हैं कि आकस्मिक हैकर्स, जो php4 का उपयोग करते हैं, उनसे खुद को बचाने के लिए। आपको अपने कोड में ऐसा नहीं करना चाहिए - यह पदावनत है।
troelskn

3
"यह अत्यधिक अनपेक्षित है और अन्य भाषाओं के काम करने के विपरीत" मैं और अधिक असहमत नहीं हो सकता।
ऑर्बिट

5
@WildlyInaccurate: डिफ़ॉल्ट रूप से संदर्भ द्वारा वस्तुओं को असाइन करना, जो .NET में और जावा में होता है (मुझे लगता है), अत्यधिक अनपेक्षित है। अधिकांश अन्य भाषाओं में, असाइनमेंट कॉपी द्वारा किया जाता है, चाहे आपके पास "ऑब्जेक्ट" या एक आदिम या जो कुछ भी हो, और चूंकि यह समय की सुबह से ही मामला रहा है, यह वही है जो दुनिया को अटक जाना चाहिए।
ऑर्बिट

4
क्या कुछ सहज है, शायद व्यक्तिपरक है। लेकिन भाषाओं के लिए जो अन्यथा PHP के समान हैं, मानदंड संदर्भ द्वारा वस्तुओं को पारित करना है। OOP के संबंध में, मैं कहूंगा कि यह सबसे सहज तरीका है, क्योंकि OOP राज्य को घेरने के बारे में है, इसलिए प्रोग्राम आमतौर पर उस राज्य को संदर्भित करेंगे, बजाय इसे क्लोन करने के।
troelskn

4

इसे अक्सर PHP में Returning reference या Reference द्वारा Returning के रूप में जाना जाता है ।

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

रिटर्निंग संदर्भ पर PHP प्रलेखन

PHP में एक संदर्भ एक चर की सामग्री को सौंपा गया दूसरा नाम है। PHP के संदर्भ सी प्रोग्रामिंग में पॉइंटर्स की तरह नहीं होते हैं, वे वास्तविक मेमोरी एड्रेस नहीं होते हैं, इसलिए उन्हें पॉइंटर अंकगणित के लिए उपयोग नहीं किया जा सकता है।

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

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

getPopulationCount()पूर्ववर्ती के साथ परिभाषित फ़ंक्शन &, सामग्री या मान का संदर्भ देता है $populationCount। इसलिए, वेतन वृद्धि, वेतन वृद्धि $countryPopulationभी $populationCount

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