2009-07-09 8 views
12

इस कोड में:PHP में ऑब्जेक्ट्स मूल्य या संदर्भ से गुज़र चुके हैं?

<?php 
class Foo 
{ 
    var $value; 

    function foo($value) 
    { 
     $this->setValue($value); 
    } 

    function setValue($value) 
    { 
     $this->value=$value; 
    } 
} 

class Bar 
{ 
    var $foos=array(); 

    function Bar() 
    { 
     for ($x=1; $x<=10; $x++) 
     { 
      $this->foos[$x]=new Foo("Foo # $x"); 
     } 
    } 

    function getFoo($index) 
    { 
     return $this->foos[$index]; 
    } 

    function test() 
    { 
     $testFoo=$this->getFoo(5); 
     $testFoo->setValue("My value has now changed"); 
    } 
} 
?> 

विधि Bar::test() चलाया जाता है और यह foo ऑब्जेक्ट की श्रेणी में foo # 5 का मूल्य बदलता है, वास्तविक foo # 5 सरणी में प्रभावित हो जाएगा, या होगा जब $testFoo चर केवल एक स्थानीय चरक है जो फ़ंक्शन के अंत में मौजूद रहेगा?

+1

संबंधित प्रश्न: http://stackoverflow.com/questions/879/php-variables-passed-by-value-or-by-reference। – TSomKes

उत्तर

20

फ़ंक्शन क्यों नहीं चलाएं और पता लगाएं? द्वारा "काम करने के लिए

Foo #5 
My value has now changed 

यह" संदर्भ से गुज़र "के कारण नहीं है, तथापि, यह वजह से है:

$b = new Bar; 
echo $b->getFoo(5)->value; 
$b->test(); 
echo $b->getFoo(5)->value; 

मेरे लिए ऊपर कोड (अपने कोड के साथ) इस उत्पादन का उत्पादन संदर्भ "। संदर्भ में PHP 5 असाइनमेंट में ऑब्जेक्ट्स के साथ डिफ़ॉल्ट व्यवहार है। यदि आप इसके बजाय मूल्य द्वारा असाइन करना चाहते हैं, तो clone कीवर्ड का उपयोग करें।

+0

php 4 पर इसके साथ क्या होता है? –

+1

PHP4 'क्लोन' के रूप में व्यवहार करेगा – Evert

+0

php 4 को php 5 के समान तरीके से असाइनमेंट करने के लिए कॉन्फ़िगर किया जा सकता है? –

4

वे पीएचपी 5 में PHP 4 में और संदर्भ द्वारा मूल्य द्वारा पारित कर रहे हैं क्रम PHP 4 में संदर्भ द्वारा पारित करने के लिए वस्तुओं में आप स्पष्ट रूप से उन्हें इस तरह के रूप में चिह्नित करना:

$obj = &new MyObj; 
10

आप http://ca2.php.net/manual/en/language.oop5.references.php का उल्लेख कर सकते आपके प्रश्न के वास्तविक उत्तर के लिए।

अक्सर वर्णित PHP5 ओओपी के प्रमुख बिंदुओं में से एक यह है कि "वस्तुओं को डिफ़ॉल्ट रूप से संदर्भों द्वारा पारित किया जाता है"। यह पूरी तरह से सच नहीं है।

एक PHP संदर्भ एक उपनाम है, जो दो अलग-अलग चर को समान मान पर लिखने की अनुमति देता है। PHP5 के रूप में, ऑब्जेक्ट वेरिएबल में ऑब्जेक्ट को अब वैल्यू के रूप में नहीं रखा जाता है। इसमें केवल एक ऑब्जेक्ट पहचानकर्ता होता है जो ऑब्जेक्ट एक्सेसर्स को वास्तविक ऑब्जेक्ट खोजने की अनुमति देता है। जब कोई ऑब्जेक्ट तर्क द्वारा भेजा जाता है, लौटाया जाता है या किसी अन्य चर को आवंटित किया जाता है, तो विभिन्न चर उपनाम नहीं होते हैं: वे पहचानकर्ता की एक प्रति धारण करते हैं, जो एक ही ऑब्जेक्ट को इंगित करता है।

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