2012-01-22 5 views
8

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

मेरा प्रश्न है:

मूल ऑब्जेक्ट पहचानकर्ता करने के लिए मूल ऑब्जेक्ट पहचानकर्ता और संदर्भ के प्रति एक ही काम करता है। वास्तविक अनुप्रयोगों में किस का उपयोग किया जाना चाहिए?

ऑब्जेक्ट पहचानकर्ता की प्रतिलिपि और ऑब्जेक्ट पहचानकर्ता के संदर्भ के पेशेवर और विपक्ष क्या हैं?

मैंने php manual पढ़ा लेकिन उपयोग की शर्तों में अंतर करने में असमर्थ क्योंकि दोनों एक ही काम करते हैं।

$instance1 = new test(1); 
$instance2 = $instance1; 
$instance3 =& $instance1; 

//$instance1 -> original object identifier of the new object. 
//$instance2 -> copy of object identifier $instance1 
//$instance3 -> reference to the object identifier $instance1 

उत्तर

5

$instance2 वस्तु परीक्षण करने के लिए पहचानकर्ता की एक प्रति है:

$a = new stdClass(); 
$a->name = "A"; 

$b = new stdClass(); 
$b->name = "B"; 

// $x is a copy of the object identifier in $a 
$x = $a; 
// $y is a reference to $a 
$y = &$a; 

// this will not affect $a 
$x = $b; 
echo $a->name; // 'A' 

// this will affect $a 
$y = $b; 
echo $a->name; // 'B' 

भी क्यों (एम्परसेंड) संदर्भ के उपयोग से बचा जाना चाहिए पर यह लेख देखें। इसलिए, इसमें $instance1 जैसा ही है। $instance3 में $instance1 का संदर्भ शामिल है। अंतर निम्नलिखित होगा:

$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

var_dump($instance1 instanceof Test); // True 
var_dump($instance2 instanceof Test); // True 
var_dump($instance3 instanceof Test); // True 

$instance3 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // True 
var_dump($instance2 instanceof AnotherTest); // False 
var_dump($instance3 instanceof AnotherTest); // True 

अगर $instance1$instance3 के बजाय बदल गया था एक ही आउटपुट लौटा दिया जाएगा।

लेकिन अगर हम निम्नलिखित किया:

$instance1 = new Test(); 
$instance2 = $instance1; 
$instance3 = & $instance1; 

$instance2 = new AnotherTest(); 

var_dump($instance1 instanceof AnotherTest); // False 
var_dump($instance2 instanceof AnotherTest); // True 
var_dump($instance3 instanceof AnotherTest); // False 

तो:

एक चर जो का संशोधन संदर्भ (& संकार्य का प्रयोग करके) द्वारा बनाई द्वारा पारित किया गया या चर यह संदर्भ देता है जो करने के लिए की , दोनों को संशोधित करता है, जबकि एक प्रतिलिपि चर के संशोधन केवल दिए गए चर को संशोधित करता है।

फिर भी, आप याद रखना चाहिए कि $instance1 क्या रहता है, वस्तु का एक पहचानकर्ता है तो:

$instance1 = new StdClass(); 
$instance2 = $instance1; 

$instance1->my_property = 1; 
var_dump($instance2); // Output: 1 

आशा है कि यह अब स्पष्ट है।

+0

आप उदाहरण समझते हैं लेकिन आपको PHP में 'पॉइंटर' शब्द का उपयोग नहीं करना चाहिए। –

+0

मैंने "poitner" शब्द का उपयोग किया क्योंकि उनके बीच मुख्य अंतर ठीक है कि इंजन उन्हें कैसे संभालता है ... मुझे नहीं पता था कि इसे अलग तरीके से कैसे वाक्यांशित किया जाए। – Lumbendil

+0

सही शब्द वस्तु पहचानकर्ता है: http://php.net/manual/en/language.oop5.references.php –

0

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

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

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

+0

क्या आप उनके बीच कोई महत्वपूर्ण अंतर इंगित कर सकते हैं? उपयोग नहीं कर रहा है और सिर्फ एक वाक्यविन्यास लाभ है। अन्यथा दोनों एक ही उद्देश्य परोसता है। –

+0

मैंने एक उदाहरण जोड़ा जिसमें यह दिखाया गया है कि ऑब्जेक्ट आइडेंटिफ़ायर का लाभ उठाने और चर संदर्भों का उपयोग करने से बचने के लिए i.c.w. वस्तुओं। –

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