2009-06-29 18 views
7

मैं उस में एक कारखाने में पैटर्न समारोह के साथ एक वर्ग है:instantiating बच्चे कक्षाओं

abstract class ParentObj { 
    public function __construct(){ ... } 
    public static function factory(){ 
     //returns new instance 
    } 
} 

मैं कारखाने फ़ंक्शन को कॉल करें और फोन करने का एक उदाहरण वापस जाने के लिए सक्षम होने के लिए बच्चों की जरूरत है कक्षा: $child = Child::factory(); और अधिमानतः बाल वर्ग में फैक्ट्री फ़ंक्शन को ओवरराइड किए बिना।

मैंने इसका लाभ उठाने के कई अलग-अलग तरीकों का प्रयास किया है। मैं उन समाधानों से दूर रहना पसंद करूंगा जो प्रतिबिंब का उपयोग करते हैं, जैसे __CLASS__

उत्तर

10

आप PHP 5.3 (released 30-Jun-2009) में नवीनीकृत कर सकते हैं (मैं PHP 5.2.5 अगर यह मायने रखती उपयोग कर रहा हूँ), late static binding की जाँच है, जो एक समाधान प्रदान कर सकता है: में

abstract class ParentObj { 
    public function __construct(){} 
    public static function factory(){ 

     //use php5.3 late static binding features: 
     $class=get_called_class(); 
     return new $class; 
    } 
} 


class ChildObj extends ParentObj{ 

    function foo(){ 
     echo "Hello world\n"; 
    } 

} 


$child=ChildObj::factory(); 
$child->foo(); 
+0

मैं क्षण में RC4 के साथ खेल रहा हूँ ... –

+0

LSB लगता है:

एक कारखाना पैटर्न इस तरह काम करेगा सबसे अच्छा समाधान होने के लिए जो मैं अपने आप पा सकता हूं। जब तक मैं अपग्रेड नहीं करता हूं, सबसे अच्छा मैं बच्चे के नाम को फैक्ट्री() में पास कर सकता हूं या नाम को संपत्ति के रूप में परिभाषित कर सकता हूं और फैक्ट्री() –

+0

से इसे पकड़ सकता हूं, PHP मैनुअल के मुताबिक, ' get_called_class() 'जो' __CLASS__' की तरह काम करता है http://us.php.net/manual/en/function.get-called-class.php –

0

मेरी विनम्र राय जो आप करने की कोशिश कर रहे हैं उसे कोई समझ नहीं आता है। तो मैं कुछ कोड शीघ्र ही अगर कोई और इस बीच में ऊपर कदम कोशिश करता हूँ

abstract class Human {} 

class Child extends Human {} 
class Fool extends Human {} 

class HumanFactory 
{ 
    public static function get($token) 
    { 
     switch ($token) 
     { 
      case 'Kid' : return new Child(); 
      case 'King': return new Fool(); 
      default : throw new Exception('Not supported'); 
     } 
    } 
} 

$child = HumanFactory::get('Kid'); 
+0

ठीक है, यह एक पूर्ण उड़ा कारखाना पैटर्न है। मैं बस 'नए' ऑपरेटर को बाईपास करने और बच्चों की कक्षाओं में पठनीयता और चेनिंग प्रदान करने के लिए एक स्थिर विधि का मतलब था। –

+0

आप नए ऑपरेटर को क्यों बाईपास करना चाहते हैं? –

+1

अपने उदाहरण का उपयोग करने के लिए, नया बच्चा() -> foo() काम नहीं करता है। "फैक्ट्री" विधि (जैसा कि मैं इसका उपयोग करता हूं) जोड़कर, आप चाइल्ड :: फैक्ट्री() -> foo() -> bar() कर सकते हैं, जो कुछ लाइनों पर इसे तोड़ने से अधिक पठनीय (आईएमएचओ) है। मुझे लगता है कि यह राय का विषय है, और निष्पक्ष होना, कारखाने का आपका कार्यान्वयन उपयोगी है। बस जो मैं खोज रहा हूं उसके लिए नहीं। –

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