2013-07-04 3 views
6

मैं PHP में स्थिर तरीकों के सही उपयोग पर थोड़ा अस्पष्ट हूं।PHP में "getInstance" और स्थिर तरीकों का सही उपयोग?

नीचे परिदृश्य में:

<?php 

class Person 
{ 
    public $data; 

    public function __construct($id) 
    { 
     // Fetch record from our data source 
     switch($id){ 
      case 1: 
       $this->data = array('id'=>1, 'name'=>'Mike'); 
       break; 
      case 2: 
       $this->data = array('id'=>2, 'name'=>'Jennifer'); 
       break; 
      default: 
       exit('Record not found!'); 
     } 
    } 

    public function getName() 
    { 
     return $this->data['name']; 
    } 

    public static function getInstance($id) 
    { 
     return new self($id); 
    } 
} 

?> 

मैं तो उत्पादन के नाम "माइक" और "जेनिफर":

उदाहरण A

<?php 

foreach(array(1,2) as $id) 
    echo Person::getInstance($id)->getName(); 

?> 

उदाहरण B

<?php 

foreach(array(1,2) as $id){ 
    $person = new Person($id); 
    echo $person->getName(); 
} 

?> 

या तो "माइकजेनिफर" प्रिंट करेगा, लेकिन मुझे बताया गया था उदाहरण ए गलत है, "क्योंकि व्यक्ति स्थिर वर्ग नहीं है"।

हालांकि कक्षा में एक वर्ग को "स्थैतिक" घोषित नहीं किया जा सकता है, तो यह क्यों मायने रखता है?

+1

"लेकिन मुझे बताया गया कि उदाहरण ए गलत है" --- यह नहीं है। जिस व्यक्ति ने आपको यह बताया वह गलत है। – zerkms

+2

व्यक्ति गलत क्यों है? पहला स्निपेट सिंगलटन पैटर्न की तरह दिखता है। ऐसा लगता है कि इस मामले में ... –

+0

यह कक्षा अभी भी कई उदाहरणों की अनुमति देगी। तो यह सिंगलटन के खराब कार्यान्वयन की तरह दिखता है। कुछ प्रकार के हाइब्रिड क्लास – tlenss

उत्तर

3

"इमरजेंसी डिज़ाइन" में, स्कॉट एल बैन ने वस्तुओं के निर्माण को सारणीबद्ध करने में पहले चरण के पैटर्न के रूप में इसका वर्णन किया है।

दिन 1: नहीं अमूर्त ...

$person = new Person($id); 

दिन 2: आप के लिए वस्तु का निर्माण करने के लिए एक स्थिर विधि ...

$person = Person::getPerson($id); 

क्यों? क्योंकि अब आपके पास अपने पूरे एप्लिकेशन में कोड का केवल एक टुकड़ा है जो जानता है कि उस व्यक्ति के पास आपके पूरे एप्लिकेशन में वितरित कोड की कई पंक्तियां होने के बजाय किसी व्यक्ति को "नया" कैसे करें। यदि आप भविष्य में किसी व्यक्ति ऑब्जेक्ट को कैसे बनाते हैं, तो आप getPerson स्थैतिक विधि को बदलने में सक्षम होंगे।

दिन 3+: आप ऑब्जेक्ट बनाने के लिए किसी ऑब्जेक्ट बिल्डर या रिपोजिटरी पर दुबला होने का निर्णय ले सकते हैं। जब आप ऐसा करना चुनते हैं, तो आप बिल्डर/रिपोजिटरी का उपयोग करने के लिए अपने getPerson स्थैतिक विधि को अपडेट कर सकते हैं और एक बार फिर परिवर्तन केवल एक ही स्थान पर होता है।

इसे "समेकन" कहा जाता है। कोड होने पर आप बहुत सारी फाइलें खोलने के बिना परिवर्तन कर सकते हैं।

+0

असहमत नहीं है, यह दिलचस्प लगता है, लेकिन 'GetPerson' विधि को बदलने और बस' व्यक्ति 'कन्स्ट्रक्टर को बदलने के बीच क्या अंतर है? –

+0

@ वेस्ले मर्च: यह कुछ प्रकाश डाल सकता है: http://en.wikipedia.org/wiki/Builder_pattern – zerkms

+1

यदि आप अपने पूरे कोड में 'नया व्यक्ति ($ आईडी)' का उपयोग करते हैं (कहें, 20 बार) आपको बदलने की जरूरत है 20 बार कन्स्ट्रक्टर। 'व्यक्ति :: GetPerson ($ id) का उपयोग करके आपको उस कोड को बदलने की ज़रूरत नहीं है। उदाहरण के लिए, अगर मुझे 'नए व्यक्ति' में निर्भरता पारित करने की आवश्यकता है तो मुझे 20 स्थानों पर निर्भरता को बनाने और पास करने की आवश्यकता नहीं होगी, केवल एक। – Fenton

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