2013-01-20 63 views
8

क्या ऑब्जेक्ट्स बनाना एक अच्छा विचार है जिसे PHP में बदला नहीं जा सकता है?PHP में अपरिवर्तनीय वस्तुएं?

उदाहरण के लिए एक दिनांक वस्तु जिसमें सेटर विधियां हैं, लेकिन वे हमेशा वस्तु का एक नया उदाहरण (संशोधित दिनांक के साथ) वापस कर देंगे।

क्या ये वस्तुएं कक्षा का उपयोग करने वाले अन्य लोगों के लिए भ्रमित हो जाएंगी, क्योंकि PHP में आप आमतौर पर ऑब्जेक्ट को बदलने की अपेक्षा करते हैं?

उदाहरण

$obj = new Object(2); 

$x = $obj->add(5); // 7 
$y = $obj->add(2); // 4 
+0

टिप्पणी जोड़ी आप वर्गों है कि ऐसा करने के लिए होने में कोई लाभ देख सकते हैं? मैं शायद एक बेहतर दृष्टिकोण मानता हूं कि * स्थायित्व * (हाँ मैंने इसे बनाया है) उन संपत्तियों से इनकार करना होगा जिन्हें आप बदलना नहीं चाहते हैं, यदि आवश्यक हो तो उन्हें एक नया उदाहरण बनाने के लिए मजबूर करना होगा। संपादित करें: हाँ, क्या ThiefMaster ने कहा :) –

+0

http: // stackoverflow।कॉम/प्रश्न/7317037/php-immutable-public-member-field यह उदाहरण आपको –

उत्तर

5

प्रारंभिक सृजन के बाद एक अपरिवर्तनीय वस्तु को बदला नहीं जा सकता है, इसलिए सेटर विधियों को कोई आधार नहीं लगता है क्योंकि यह उस आधार सिद्धांत के खिलाफ जाता है।

आप वर्ग सदस्य दृश्यता में हेरफेर करके और जादू __set() विधि को ओवरराइड करके PHP में अपरिवर्तनीयता अनुकरण करने के लिए कुछ कामकाज लागू कर सकते हैं, लेकिन इसकी अपरिवर्तनीयता की गारंटी नहीं है क्योंकि अपरिवर्तनीयता भाषा की विशेषता नहीं है। मेरा मानना ​​है कि किसी ने एक बार PHP में एक अपरिवर्तनीय मूल्य प्रकार प्रदान करने के लिए एक एक्सटेंशन लिखा था, हालांकि आप इसके लिए Google पर जा सकते हैं।

+2

PHP आरएफसी: अपरिवर्तनीय कक्षाएं और गुण https://wiki.php.net/rfc/immutability –

+0

"सेटर विधियों को कोई समझ नहीं आता" के संबंध में: एक विधि 'add' (जैसा कि प्रश्न में उल्लिखित है) में हो सकता है संशोधित स्थिति के साथ एक नई वस्तु लौटकर एक अपरिवर्तनीय वस्तु। –

17

अपरिवर्तनीय वस्तुओं सेटर तरीकों की जरूरत नहीं है। अवधि।

प्रत्येक व्यक्ति setXyz() विधि को शून्य वापसी प्रकार (या ढीली टाइप की गई भाषाओं में कुछ भी वापस करने के लिए) की अपेक्षा करेगा। यदि आप अपनी अपरिवर्तनीय वस्तु में सेटर विधियों को जोड़ते हैं तो यह लोगों से नरक को भ्रमित कर देगा और बदसूरत बग का नेतृत्व करेगा।

+1

को समझने में मदद कर सकता है, उन्हें सेट() की तरह नहीं कहा जाएगा, लेकिन मुझे नहीं पता कि उन्हें कैसे कॉल करें। addetter विधियों? :) – Elfy

+0

हालांकि कुछ "हर कोई" सेटर के ऑब्जेक्ट का उदाहरण प्राप्त करने के लिए आश्चर्यचकित नहीं होगा, विधि विधि को अनुमति देने के लिए ;-) –

+4

@Elfy उन्हें "साथ" विधियों पर कॉल करें। '$ obj-> MyProp ($ x) के साथ * एक नया उदाहरण * *" MyProp "के साथ' $ x' पर सेट किया गया है। – mpen

8

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

यहां कुछ गलत जवाब हैं, एक अपरिवर्तनीय वस्तु में सेटर्स हो सकते हैं। PHP में अपरिवर्तनीय वस्तुओं के कुछ कार्यान्वयन यहां दिए गए हैं।

उदाहरण # 1।

class ImmutableValueObject 
{ 
    private $val1; 
    private $val2; 

    public function __construct($val1, $val2) 
    { 
     $this->val1 = $val1; 
     $this->val2 = $val2; 
    } 

    public function getVal1() 
    { 
     return $this->val1; 
    } 

    public function getVal2() 
    { 
     return $this->val2; 
    } 
} 

जैसा कि आप तुरंत देख सकते हैं कि आप किसी भी मूल्य को बदल नहीं सकते हैं।

उदाहरण 2: setters साथ:

class ImmutableValueObject 
{ 
    private $val1; 
    private $val2; 

    public function __construct($val1, $val2) 
    { 
     $this->val1 = $val1; 
     $this->val2 = $val2; 
    } 

    public function getVal1() 
    { 
     return $this->val1; 
    } 

    public function withVal1($val1) 
    { 
     $copy = clone $this; 
     $copy->val1 = $val1; 

     return $copy; // here's the trick: you return a new instance! 
    } 

    public function getVal2() 
    { 
     return $this->val2; 
    } 

    public function withVal2($val2) 
    { 
     $copy = clone $this; 
     $copy->val2 = $val2; 

     return $copy; 
    } 
} 

वहाँ कई कार्यान्वयन संभव है और यह कोई एक विशेष सूची भी तरह से है। और याद रखें कि प्रतिबिंब के साथ हमेशा PHP में घूमने का एक तरीका होता है, इसलिए अंत में अपरिवर्तनीयता आपके सिर में होती है!

अपरिवर्तनीय वस्तुओं को अंतिम रूप में रखना अक्सर अच्छा अभ्यास होता है।

संपादित करें:

  • withX
  • के लिए setX बदल के बारे में अंतिम
+0

'इसे $ वापस करना चाहिए' वास्तव में '$ copy' वापस कर देना चाहिए? –

+0

उस –

+0

के लिए त्रुटि धन्यवाद फिक्स्ड "कंप्यूटर विज्ञान में, एक म्यूटेटर विधि एक चर है जो एक चर में परिवर्तनों को नियंत्रित करने के लिए उपयोग की जाती है। उन्हें सेटर विधियों के रूप में भी व्यापक रूप से जाना जाता है .__ एक अपरिवर्तनीय ऑब्जेक्ट में setters__ नहीं हो सकता है। उनके तरीके वस्तु की आंतरिक स्थिति नहीं बदलते हैं। __ वे सिर्फ एक नया उदाहरण बनाता है। यह एक बड़ा अलग है। –