2011-06-06 15 views

उत्तर

41

दोनों मानों को कच्चे प्रकार के साथ एक प्रतिलिपि देता है।

test.php

$a = $b = 0; 

$b = 3; 

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

आउटपुट:

int(0) 
int(3) 
वस्तुओं हालांकि साथ

, कि एक और कहानी है (PHP 5)

test.php

class Obj 
{ 
    public $_name; 
} 

$a = $b = new Obj(); 

$b->_name = 'steve'; 

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

आउटपुट

object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
+6

नोट, कि उदाहरण भ्रामक है: किसी ऑब्जेक्ट की प्रॉपर्टी को बदलना वैरिएबल को बदलने के समान नहीं है जिस पर ऑब्जेक्ट का संदर्भ दिया गया है। क्योंकि चर कभी नहीं बदला है, यह _of course_ वही है। – KingCrunch

+1

[दस्तावेज़ीकरण] के अनुसार (http://php.net/manual/en/internals2.variables.intro.php), PHP लेखन प्रणाली पर एक प्रति का उपयोग करता है। इसका मतलब है कि तारों या स्याही जैसे आदिम प्रकारों के साथ वास्तव में परिवर्तन पर स्मृति में बनाया जाता है। यही कारण है कि, हम जो सोच सकते हैं उसके विपरीत, छोटे चर पर प्रदर्शन अनुकूलित करने के संदर्भ बनाने से वांछित प्रभाव नहीं आ सकता है, क्योंकि PHP को इसे पहले बनाना होगा। हालांकि, PHP5 के बाद डिफ़ॉल्ट रूप से ऑब्जेक्ट्स संदर्भ द्वारा पारित किए जाते हैं। – bgondy

+3

ऑब्जेक्ट्स के संदर्भ में असाइनमेंट को 'क्लोन' का उपयोग करके कॉपी द्वारा असाइन करने के लिए बदला जा सकता है।ईजी: '$ ए = क्लोन $ बी = नया ओबीजे;' – fyrye

9

तुम खुद करने की कोशिश की हो सकता था

$a = $b = 0; 
$a = 5; 
echo $b; 

या

$a = $b = 0; 
$b = 5; 
echo $a; 

(वर्तमान में मैं वास्तव में न परवाह: डी)

इस प्रकार: नहीं, वे मूल्य के साथ दोनों स्वतंत्र चर हैं 0

+0

उस उदाहरण में, संदर्भ को प्रस्तुत करने के लिए आपको दूसरी पंक्ति पर 5 से $ बी असाइन नहीं करना होगा? और हाँ, आप सही हैं। मुझे लगता है कि यहां प्रश्न पूछने वाले लोगों के लिए अच्छा होगा हालांकि ... –

+0

@Evil: इसके बारे में सोचना नहीं चाहते हैं, इसलिए दूसरे रास्ते को भी जोड़ा। दोनों '0' वापस लौटते हैं, इस प्रकार यह किसी भी मामले में _must_ सच हो जाता है :) – KingCrunch

+0

मैंने आज कुछ सीखा। यह छोटा हो सकता है, लेकिन हमेशा मजेदार हो सकता है। –

18

संबंध इस कोड के रूप में:

$a = ($b = 0); 

अभिव्यक्ति $b = 0 न केवल 0$b को प्रदान करती है, लेकिन यह भी एक परिणाम अर्जित करता है। यही कारण है कि परिणाम असाइनमेंट के दाएँ भाग, या बस मूल्य कि $b करने के लिए सौंपा गया है।

तो, $a सौंप दिया जाता है 0 रूप में अच्छी तरह।

3

मैं इस पर एक अच्छा पढ़ा सुझाव देंगे: http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/। टिप्पणियों में से एक में, आप पढ़ सकते हैं:

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

तो मैं व्यक्तिगत रूप से अनुशंसा करता हूं कि आप चर को अलग से असाइन करें।

रिकॉर्ड के लिए:

$a = $b = 4; 
var_dump($a, $b); 
$b = 5; 
var_dump($a, $b); 

पैदावार:

int(4) 
int(4) 
int(4) 
int(5) 

लेकिन:

class Tmp 
    { 
    public $foo; 

    public function __construct() 
     { 
     $this->foo = 'bar'; 
     } 
    } 

$a = $b = new Tmp(); 
var_dump($a, $b); 
$a->foo = 'oth'; 
var_dump($a, $b); 

पैदावार:

object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "bar" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "bar" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "oth" 
} 
object(Tmp)#1 (1) { 
    ["foo"]=> 
    string(3) "oth" 
} 

तो निष्कर्ष यह है कि प्राइमेटिव के लिए कोई संदर्भ नहीं है, लेकिन वस्तुओं का संदर्भ है।

+0

हमने कुछ परीक्षणों के साथ वास्तव में यह झूठा साबित किया। –

+0

मैंने अपना जवाब अपडेट कर दिया है। –

2

दोनों $ एक और $ ख 0. की है कि मूल्य आवंटित कर रहे हैं आप $ एक के संदर्भ $ ख, आप इसे को एम्परसैंड द्वारा जगह ले लेना होता है, उदाहरण के लिए करना चाहता था, तो:

$a = & $b = 0; 

http://php.net/manual/en/language.oop5.basic.php

2

यह निर्भर करता है कि आप क्या आवंटित कर रहे हैं।

यदि आप कोई मान निर्दिष्ट कर रहे हैं, तो असाइनमेंट मूल चर को नए पर कॉपी करता है।

उदाहरण 1:

$a = $b = 0; 
$b++; echo $a; 

कोड से ऊपर 0 वापस आ जाएगी, क्योंकि यह काम मूल्य से है।

उदाहरण 2:

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4. 

पीएचपी भीतर मूल्य व्यवहार से हमेशा की तरह काम करने के लिए एक अपवाद वस्तुओं, जो स्वत: PHP 5 में संदर्भ द्वारा आवंटित कर रहे हैं के साथ होता है। ऑब्जेक्ट को क्लोन कीवर्ड के माध्यम से स्पष्ट रूप से कॉपी किया जा सकता है।

उदाहरण 3

$a = $b = $c = new DOMdocument(); 
$c->appendChild($c->createElement('html')); 
echo $a->saveHTML(); 

कोड से ऊपर <html></html> प्रिंट होगा।

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