2012-08-30 8 views
5

संभव डुप्लिकेट:
what is Object Cloning in php?पीएचपी क्लोन कीवर्ड

मैं एक मौजूदा ढांचे जो एक "क्लोन" का उपयोग करता है पढ़ रहा हूँ एक बहुत कीवर्ड, यकीन नहीं है कि क्या यह करने के लिए एक अच्छा विचार है इस ? मैं वास्तव में 'क्लोन' कीवर्ड का उपयोग करने की आवश्यकता को समझ नहीं पा रहा हूं।

उदाहरण के लिए

इस कोडिंग

यानी

public function getStartDate() 
    { 
    return clone $this->startDate; 
    } 

मुझे यह समारोह नीचे की तरह होना चाहिए पर नजर है, मुझे नहीं क्लोन की जरूरत को देखते हैं।

public function getStartDate() 
    { 
    return $this->startDate; 
    } 
+0

[प्रोटोटाइप डिजाइन पैटर्न] (http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/रेफरी = sr_1_1) भी एक अच्छा उपयोग मामला है। – pce

उत्तर

6

क्लोन का उपयोग करने का कारण यह है कि ऑब्जेक्ट के साथ काम करते समय PHP हमेशा एक संदर्भ के रूप में ऑब्जेक्ट देता है, प्रतिलिपि के रूप में नहीं।

है यही कारण है कि जब एक समारोह के लिए वस्तु गुजर आप & (संदर्भ) के साथ यह निर्दिष्ट करने की आवश्यकता नहीं है:

function doSomethingWithObject(MyObject $object) { // it is same as MyObject &object 
    ... 
} 

तो आदेश वस्तु प्राप्त करने के लिए कॉपी आप क्लोन कीवर्ड उपयोग करने के लिए यह वह जगह है कैसे वस्तुओं पर एक उदाहरण php द्वारा नियंत्रित किया जाता है और क्या क्लोन करता है:

class Obj { 
    public $obj; 
    public function __construct() { 
     $this->obj = new stdClass(); 
     $this->obj->prop = 1; // set a public property 
    } 
    function getObj(){ 
     return $this->obj; // it returns a reference 
    } 
} 

$obj = new Obj(); 

$a = $obj->obj; // get as public property (it is reference) 
$b = $obj->getObj(); // get as return of method (it is also a reference) 
$b->prop = 7; 
var_dump($a === $b); // (boolean) true 
var_dump($a->prop, $b->prop, $obj->obj->prop); // int(7), int(7), int(7) 
// changing $b->prop didn't actually change other two object, since both $a and $b are just references to $obj->obj 

$c = clone $a; 
$c->prop = -3; 
var_dump($a === $c); // (boolean) false 
var_dump($a->prop, $c->prop, $obj->obj->prop); // int(7), int(-3), int(7) 
// since $c is completely new copy of object $obj->obj and not a reference to it, changing prop value in $c does not affect $a, $b nor $obj->obj! 
0

के बावजूद यह perfectley

बस एक त्वरित जवाब (इस @gerald ओर इशारा करते हुए के लिए धन्यवाद) में another question समझाया गया है:

एक क्लोन समारोह STARTDATE वस्तु के लिए एक संदर्भ लौटने के बिना

। क्लोन के साथ एक प्रतिलिपि लौटने के साथ।

यदि लौटाया गया ऑब्जेक्ट बाद में बदला जाएगा, तो यह केवल प्रतिलिपि बदलता है, न कि मूल, जिसे कहीं और भी इस्तेमाल किया जा सकता है।

+0

लेकिन मुद्दा पूरी तरह से ऑब्जेक्ट उन्मुख डिजाइन में है, हमें क्लोन ऑब्जेक्ट के चारों ओर पारित होने वाली वास्तविक वस्तु की आवश्यकता नहीं है, है ना?मेरे लिए क्लोन ऑब्जेक्ट्स का उपयोग करके यह डिज़ाइन एक कक्षा में गलत होता है जब ओओ डिज़ाइन अभ्यास का उपयोग करता है .. – mahen3d

3

शायद startDate एक वस्तु है।

फिर। जब आप clone $this->startDate वापस करते हैं - आपको ऑब्जेक्ट की पूर्ण प्रति प्राप्त होती है। आप इसके साथ खेल सकते हैं, मूल्यों को बदल सकते हैं, कॉल फ़ंक्शन कर सकते हैं। और, जब तक वे डेटाबेस या फाइल सिस्टम को प्रभावित नहीं करते - यह सुरक्षित है और वास्तविक startDate ऑब्जेक्ट संशोधित नहीं किया जाएगा।

लेकिन, यदि आप केवल वस्तु को वापस लौटते हैं - तो आप केवल एक संदर्भ लौटाते हैं। और आपके द्वारा किए गए ऑब्जेक्ट के साथ कोई भी ऑपरेशन - आप मूल ऑब्जेक्ट के साथ यह ऑपरेशन करते हैं। आपके द्वारा किए गए कोई भी बदलाव - यह startDate को प्रभावित करेगा।

यह केवल ऑब्जेक्ट्स के लिए है और एरे, स्ट्रिंग्स और संख्याओं को प्रभावित नहीं करता क्योंकि वे मूल्य-प्रकार चर हैं।

आपको मूल्य-प्रकार चर और संदर्भ-प्रकार चर के बारे में अधिक पढ़ना चाहिए।