2016-01-06 11 views
6

मैंने सोचा कि PHP = एक साधारण मूल्य असाइनमेंट था। उदाहरण के लिए:PHP असाइनमेंट इस तरह से क्यों व्यवहार करता है?

$x = 1; 
$a = $x; 
$b = $x; 
$a++; 
echo $a; 
echo $b; 

21 उत्पादन के रूप में उत्पादित करता है। हालांकि, नीचे दिया गया कोड अलग-अलग व्यवहार करता है जो मुझे अपेक्षित था। मैं मूल रूप से कई चर करने के लिए "एक ही" मान देना कोशिश कर रहा था:

class X { 
    public $val = 0; 

    public function doSomething() { 
     $this->val = "hi"; 
    } 
} 

function someFunction() { 
    $template = array('non_object' => 0, 'object' => new X()); 
    $a = $template; 
    $b = $template; 

    //Do something 
    $a['object']->doSomething(); 

    var_dump($a); 
    var_dump($b); 
} 

का उत्पादन:

array(2) { 
    ["non_object"]=> 
    int(0) 
    ["object"]=> 
    object(X)#1 (1) { 
    ["val"]=> 
    string(2) "hi" 
    } 
} 
array(2) { 
    ["non_object"]=> 
    int(0) 
    ["object"]=> 
    object(X)#1 (1) { 
    ["val"]=> 
    string(2) "hi" 
    } 
} 

आप array A अपेक्षा के अनुरूप बदल में object संपत्ति देख सकते हैं, लेकिन यह भी array B में बदल दिया है।

आप यहाँ कोड की जांच कर सकते हैं: http://sandbox.onlinephpfunctions.com/code/bff611fc9854b777114d38a3b4c60d524fdf2e19

मैं कैसे कई पीएचपी चर को समान मान प्रदान और उन्हें इस "क्वांटम उलझाव" राज्य में और नकल के बिना बिना उन्हें हेरफेर कर सकते हैं?

उत्तर

1

PHP 5 के रूप में, सभी वस्तुओं पारित कर रहे हैं और संदर्भ

द्वारा आवंटित

नीचे अपना कोड

$a = $template; 
    $b = $template; 

कारण कारण आपको अनपेक्षित परिणाम मिला:

वास्तव में क्या यहां होता है, $a और $b सिर्फ 'संकेत' या कि एक ही वस्तु $template करने के लिए 'संचालकों' की ओर इशारा करते की तरह हैं और thats कारण आप कुछ से मुलाकात की आप क्योंकि अप्रत्याशित संदर्भों में से एक के माध्यम से वस्तु बदल $a और $b भी एक ही वस्तु का संदर्भ के बाद से, आप परिवर्तन

पीएचपी से मैनुअल देखा Objects and References

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

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

5

आपने एक ही ऑब्जेक्ट के साथ परिवर्तनीय $ ए और $ बी असाइन किया है। इसलिए यदि आप $a["object"]->doSomething() या $b["object"]->doSomething() पर कॉल करते हैं तो एक ही परिणाम देगा क्योंकि $a["object"] और $b["object"] समान हैं।

आप आउटपुट की जरूरत है अलग होने के लिए, नीचे दिए गए कोड का प्रयास करें:

class X { 
    public $val = 0; 

    public function doSomething() { 
     $this->val = "hi"; 
    } 
} 

function someFunction() { 
    $a = array('non_object' => 0, 'object' => new X()); 
    $b = array('non_object' => 0, 'object' => new X()); 

    //Do something 
    $a['object']->doSomething(); 

    var_dump($a); 
    var_dump($b); 
} 

आउटपुट के रूप में नीचे हो जाएगा:

array(2) { 
    ["non_object"]=> 
    int(0) 
    ["object"]=> 
    object(X)#1 (1) { 
    ["val"]=> 
    string(2) "hi" 
    } 
} 
array(2) { 
    ["non_object"]=> 
    int(0) 
    ["object"]=> 
    object(X)#2 (1) { 
    ["val"]=> 
    int(0) 
    } 
} 

यहाँ आप $ एक एक $ ख के लिए अलग अलग वस्तु बताए जाते हैं।

Please check this

+2

यह भी देखें: http://docs.php.net/manual/en/language.oop5.references.php – VolkerK

1

आप केवल मान देना चाहते हैं, तो यू का उपयोग कर सकते समारोह: क्लोन

class X { 
    public $val = 0; 

    public function increment() { 
    $this->val += 1; 
    } 
} 

function someFunction() { 
    $template =new X(); 
    $a = $template; 
    $b = clone $template; 

    //Increment a 
    $a->increment(); 

    var_dump($a); 
    var_dump($b); 
} 

someFunction(); 

$x = 1; 
$a = $x; 
$b = $x; 

$a++; 
echo $a; 
echo $b; 

check this

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