2012-02-02 10 views
5

यदि मैं संदर्भ द्वारा फ़ंक्शन कॉल पर एक चर या ऑब्जेक्ट पास करता हूं, तो मुझे लगता है कि यह स्मृति में दूसरी वस्तु बनाने से बचाता है, इस प्रकार संसाधनों को संरक्षित करता है? उदाहरण के लिए:संदर्भ द्वारा उत्तीर्ण करना नया चर बनाने से बचें?

<?php 

class CoolObject 
{ 
    // Have some properties here 

    public function __construct() 
    { 
     // Do some stuff 
    } 

    public function test() 
    { 
     echo("Test"); 
    } 
} 

function doSomething(&$param) 
{ 
    // Calls original instance, still only one object in memory 
    $param->test(); 

    // Does this create a second instance in memory, or just assign 
    // the reference? 
    $newObj = $param; 
} 

// Create 1st instance of object in memory 
$myObj = new CoolObject; 

// Do a test to determine number of instances created 
doSomething($myObj); 

?> 

जब मैं $ newObj करने के लिए "संदर्भ द्वारा" चर सौंपा है, यह एक नया एक स्मृति में दो अप करने के लिए गिनती लाने बनाया था, या यह सिर्फ संदर्भ अभी भी केवल एक ही वस्तु छोड़ने पारित किया ?

उत्तर

3

यदि आप संदर्भ द्वारा एक चर में पास करते हैं, तो आप सही हैं कि यह ऑब्जेक्ट को डुप्लिकेट नहीं करता है। इसके बजाए, यह वस्तु को पॉइंटर की प्रतिलिपि बनाता है। इसलिए, जबकि यह कुछ स्मृति का उपयोग करता है, यह केवल सूचक के आकार के बराबर स्मृति की मात्रा है।

जब आप एक ही ऑब्जेक्ट को इंगित करते हैं जो एक ही ऑब्जेक्ट को इंगित करता है, तो आप उपरोक्त परिणामों के साथ पॉइंटर की प्रतिलिपि बना रहे हैं।

संदर्भ गणना और वस्तुओं के रूप में, जब भी आप सूचक की प्रतिलिपि बनाते हैं, संदर्भ काउंटर बढ़ता जाता है।

केवल जब संदर्भ गणना शून्य है तो वस्तु मुक्त हो जाती है।

1

मेरे समझ है कि अगर आप संदर्भ द्वारा पारित, आप एक नया चर बना नहीं है, लेकिन चर आपको लगता है कि समारोह में उपयोग करने के लिए किए गए परिवर्तनों को भी मूल चर है कि आप में पारित असर होगा।

+0

ठीक है, मैं समझता हूं। दूसरे भाग के बारे में क्या ... $ newObj $ newObj या myObj $ "पॉइंटर" है? –

0

वस्तुओं हमेशा संदर्भ द्वारा पारित कर रहे हैं। यदि आप स्पष्ट रूप से & साइन का उपयोग करते हैं तो केवल सामान्य वर्णों को संदर्भ द्वारा पारित किया जाता है। इसलिए $myObj एक "सूचक"

+0

वह पहला वाक्य था जो मुझे Google खोज के लिए आवश्यक था।यहां मैंने http://php.net/manual/en/language.oop5.references.php सीखा है –

2

ऑब्जेक्ट के संदर्भों और मानों की सामान्य अवधारणा को आम तौर पर कम समझा जाता है। एक वस्तु चर वस्तु को एक हैंडल होता है, इसलिए यदि $x किसी वस्तु है और हम अन्य चर के एक जोड़े के लिए असाइन करें, कहना

$x = new Jim; 
$d = $x; 
$e &= $x; 

2dn ​​और 3 बयान सस्ते कार्य कर रहे हैं इन सभी कर के रूप में आवंटित करने के लिए है एक वस्तु संभाल। यह उदाहरण के लिए $y=5 के रूप में लागत का एक ही क्रम है।

$d->someproperty और $d->somemethod()$x->someproperty और $x->somemethod() जैसा ही देखें। $e के लिए डितो। अंतर तब होता है जब आप $d और $e के लिए नया कार्य कार्य करें:

$d = new Fred; 
$e = $someotherobject; 

$d अब $x से एक अलग वस्तु को संदर्भित करता है, लेकिन $x अन्यथा अपरिवर्तित है। $e असाइनमेंट $e के साथ अभी भी उसी वस्तु को $x के रूप में संदर्भित करता है लेकिन दोनों अब को Fred पर संदर्भित करते हैं। इसने एक दुष्प्रभाव, जानबूझकर या (आमतौर पर) आकस्मिक बनाया है। फ़ंक्शन तर्कों के माध्यम से ऐसा करना वही है।

नैतिक: वस्तुओं के साथ संदर्भ का उपयोग जब तक आप वास्तव में समझते हैं कि आप क्या कर रहे हैं, और क्यों, और नुकसान क्या हैं न करें।

संबंधित मुद्दे