2009-06-29 18 views
7

da onunla ilgili bir fabrikada desen fonksiyonu ile bir sınıf var:başlatmasını çocuk sınıfları

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

ben fabrika işlevi çağırmak ve arama bir örneğini iade edebilmek için çocukların ihtiyaç Sınıf: $child = Child::factory(); ve tercihen çocuk fonksiyonunda fabrika fonksiyonunu geçersiz kılmadan.

Bunu elde etmenin birçok farklı yolunu denedim. __CLASS__ gibi yansımayı kullanan çözümlerden uzak durmayı tercih ederim.

bir çözüm olabilecek şekilde, late static binding göz atın

cevap

10

PHP 5.3 (released 30-Jun-2009) yükseltebilirsiniz Eğer (Ben bu konularda, PHP 5.2.5 kullanıyorum): In

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

Ben kimsenin bu arada artırdı kısaca eğer bazı kodlar çalışacağım böylece ... –

+0

LSB görünüyor Kendi başıma bulabileceğim en iyi çözüm olmak. Yükseltme yapmadan önce, en iyisi çocuk ismini fabrikaya() aktarmak veya adı bir özellik olarak tanımlamak ve fabrikadan alıp almak() –

+0

PHP el kitabına göre bir işlev var. get_called_class() '' __CLASS__' gibi çalışır http://us.php.net/manual/en/function.get-called-class.php –

0

benim alçakgönüllü görüşe yapmaya çalıştığınız şey mantıklı değil.

bir fabrika deseni şu şekilde çalışacak: Ben dakikada RC4 oynuyorum

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

Eh, bu tam bir fabrika modeli. Ben sadece 'yeni' operatörünü atlamak ve çocuk sınıflarına okunabilirlik ve zincirleme sağlamak için statik bir yöntem kastettim. –

+0

neden yeni operatörü atlamak istersiniz? Örneğinizi kullanmak için –

+1

, yeni Child() -> foo() çalışmıyor. "Fabrika" yöntemini ekleyerek (kullandığım gibi), bir kaç satırın üzerine ayırarak daha okunaklı (IMHO) olan Child :: factory() -> foo() -> bar() yapabilirsiniz. Sanırım bu bir fikir meselesi ve adil olmak için, bir fabrikanın uygulamanız yararlıdır. Sadece aradığım şey için değil. –

İlgili konular