2011-01-11 20 views
26

के भीतर से कक्षा का उदाहरण बनाएं जैसा कि शीर्षक कहता है, मैं एक वर्ग के एक स्थिर विधि के भीतर से एक वर्ग का उदाहरण बनाना चाहता हूं। मैंने अभी तक यह पता लगाया है कि मैं ऐसा कुछ कर सकता हूं:स्थैतिक विधि

class Foo{ 

public $val; 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 

} 

जो मुझे ऐसा करने देता है।

$obj = Foo::bar("some variable"); 

जो बढ़िया है।

तो अब सवाल। क्या ऐसा करने का कोई आसान तरीका है कि मुझे पता नहीं है, या एक ही परिणाम प्राप्त करने के लिए कोई शॉर्टकट नहीं है? क्या इस फैशन में एक उदाहरण बनाने के कोई फायदे या नुकसान हैं?

धन्यवाद।

+2

यह इस तरह से करने के लिए अपने कारण क्या है? सादा '$ obj = new foo (" कुछ चर ") का उपयोग क्यों न करें;'? –

+1

यह मुझे समझ में नहीं आता है कि कन्स्ट्रक्टर के साथ कुछ बनाने के लिए जो कुछ बिंदु पर पहले से ही किया गया है। उदाहरण के लिए, वर्तमान प्रोजेक्ट में, मैं प्रोफाइल :: get() को उस प्रोफ़ाइल में लोड करने के लिए उपयोग करता हूं जिसमें (कुछ बिंदु पर) पहले ही "निर्मित" हो गया है। शायद मैं कन्स्ट्रक्टर का दुरुपयोग कर रहा हूं या ओवरलोडिंग के जवाब के रूप में इसका उपयोग कर रहा हूं। – daniel

उत्तर

68

वे जिस तरह से आप कर रहे हैं वह ठीक है। ऐसी कुछ अन्य चीजें हैं जो आपके जीवन को आसान बना सकती हैं जो आप भी कर सकते हैं।

  1. कक्षा का नाम हार्डकोड न करें। यदि आप 5.3+ पर हैं, तो कीवर्ड static का उपयोग करें। इस तरह, अगर तुम वर्ग का विस्तार, नए कार्य का दृष्टांत सकता है कि रूप में अच्छी तरह से एक:

    public static function bar($var) { 
        $obj = new static(); 
        $obj->var = $var; 
        return $obj; 
    } 
    

    तो फिर तुम कुछ भी ओवरराइड करने के लिए जरूरत के बिना किसी भी विस्तार कक्षा में इसका इस्तेमाल कर सकते हैं।

  2. चित्र के बाद सेट किए जाने के बजाय $var को एक निर्माता के माध्यम से पारित किया जाना चाहिए। यदि वस्तु इस पर निर्भर करती है, तो आपको इसकी आवश्यकता होनी चाहिए।

    public function __construct($var) { 
        $this->var = $var; 
    } 
    

    इस तरह आप चर को सेट किए बिना ऑब्जेक्ट को तुरंत चालू नहीं कर सकते हैं।

  3. स्थिर विधि के माध्यम से कक्षा के तत्कालता को लागू करें। यदि आप वहां कुछ भी कर रहे हैं जो आपको करने की ज़रूरत है, तो कन्स्ट्रक्टर को या तो संरक्षित या निजी बनाएं। इस तरह, कोई स्थिर विधि को बाईपास नहीं कर सकता है।

    protected function __construct() {} 
    private function __construct() {} 
    

मुझे आशा है कि मदद करता है ...

संपादित करें: उपरोक्त आपकी टिप्पणी के आधार पर, यह मुझे लगता है जैसे आप Singleton Design Pattern को लागू करने की कोशिश कर रहे हैं। वहां बहुत सारी जानकारी है कि यह एक अच्छा विचार क्यों नहीं है और यह बुरी चीजें क्यों कर सकती हैं। यह भी उपयोग करता है।

लेकिन कुछ अन्य पैटर्न हैं जो आप वास्तव में क्या कर रहे हैं इसके आधार पर आपके लिए उपयोग किए जा सकते हैं।

  • यदि आप एक ही चरण का उपयोग करके विभिन्न वस्तुओं को बनाने की कोशिश कर रहे हैं तो आप Factory Method का उपयोग कर सकते हैं।
  • यदि सभी ऑब्जेक्ट्स उसी से शुरू होते हैं और फिर अनुकूलित किए जाते हैं, तो आप Prototype Pattern का उपयोग कर सकते हैं।
  • यदि आप अपनी ऑब्जेक्ट बनाने के लिए विशेष रूप से महंगा हैं तो आप Object Pool का उपयोग कर सकते हैं।

लेकिन विचार करने की एक बात यह है कि PHP ऑब्जेक्ट्स में बहुत हल्के वजन होते हैं। उस ओवरहेड के लिए केवल एक नई वस्तु बनाने से बचने की कोशिश न करें। डेटाबेस क्वेरी या फाइल सिस्टम जैसे भारी चीजों को करने से बचें कई बार एक्सेस करता है। लेकिन new Foo() पर कॉल करने के बारे में चिंता न करें जब तक कि foo का निर्माता विशेष रूप से भारी न हो ...

0

यदि आप केवल एक वस्तु बना रहे हैं, तो यह बहुत उपयोगी नहीं है। आप बस एक कन्स्ट्रक्टर कॉल कर सकते हैं। लेकिन अगर आप कुछ और जटिल कर रहे हैं (जैसे कि आप किसी प्रकार के सिंगलटन पैटर्न से शुरू कर रहे हैं लेकिन इस उदाहरण में सभी विवरण शामिल नहीं किए हैं), तो

यह सही लगता है। आप के लिए एक निजी निर्माता जोड़ सकते हैं

$obj = new Foo("Some Variable"); 

: आप इस तरह डिफ़ॉल्ट तरह से बनाई गई वस्तुओं को रोकने के लिए चाहते हैं

class Foo{ 

public $val; 

private __construct(){} 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 
} 

अब आप अपने स्थिर वर्ग का उपयोग करने के लिए लोगों को लागू। फ़ंक्शन में वैल सेट करने की आवश्यकता समाप्त हो सकती है, इसलिए आप अपने निजी कन्स्ट्रक्टर को मूल्य-पैरामीटर भी जोड़ सकते हैं, लेकिन अन्य चीजें (जो संभवतः आप करना चाहते हैं, जैसे कि कुछ प्रकार के सिंगलटन पैटर्न की जांच करें) 'बार' फ़ंक्शन

3

यह एक साधारण फैक्ट्री विधि पैटर्न जैसा दिखता है।

आपके पास एक अच्छा फायदा है: मान लीजिए कि भविष्य में आप एक अलग कार्यान्वयन का उपयोग शुरू करना चाहते हैं (लेकिन यह वही काम करता है)। फैक्ट्री का उपयोग करके आप निर्माता ऑब्जेक्ट को बदलकर बस एक जटिल प्रणाली के कई स्थानों पर बनाए गए सभी ऑब्जेक्ट्स को बदल सकते हैं। ध्यान दें कि यदि आप बाहरी वर्ग का उपयोग करते हैं तो यह आसान काम करेगा (जैसा कि नीचे दिए गए पहले लिंक में है)।

इसे अभी आपके पास रखते हुए, आप इस वर्ग को उप-वर्ग भी बना सकते हैं और अधिक जटिल वस्तु बनाने के लिए विधि को ओवरराइड कर सकते हैं। मुझे नहीं लगता कि यह वही है जो आप यहां हासिल करना चाहते हैं।

वैसे भी, यह टेस्ट संचालित विकास, अमूर्तता और अन्य अच्छी चीजों को सक्षम करने के लिए अच्छा है।

लिंक:

  1. Php patterns
  2. Factory method pattern on wikipedia
संबंधित मुद्दे