PHP dinamik fabrika yöntemini oluşturma (<5.3)

1 Cevap php

Nasıl bir tipik PHP dinamik bir fabrika yöntemini oluşturmak istiyorsunuz? Dinamik fabrika yöntemi ile, ben verilen argüman bazı yönlerini dayalı oluşturmak için vardır ne nesneleri otomatik bulma edecek bir fabrika yöntemini demek. Tercihen iki fabrika ile önce onları kayıt olmadan. Ben mümkün nesneler olsa ortak bir yerde (bir dizin) yerleştirilmelidir sahip iyiyim.

Ben bu gibi fabrika yöntemi, sizin tipik switch deyimi önlemek istiyor:

public static function factory( $someObject )
{
    $className = get_class( $someObject );
    switch( $className )
    {
        case 'Foo':
            return new FooRelatedObject();
            break;
        case 'Bar':
            return new BarRelatedObject();
            break;
        // etc...
    }
}

Benim özel durum fabrika için oy öğe dayalı bir oylama deposu oluşturmak ile ilgilenir. Öğeleri tüm bir Voteable arabirimini uygular. Böyle bir şey:

Default_User implements Voteable ...
Default_Comment implements Voteable ...
Default_Event implements Voteable ...

Default_VoteRepositoryFactory
{
    public static function factory( Voteable $item )
    {
        // autodiscover what type of repository this item needs
        // for instance, Default_User needs a Default_VoteRepository_User
        // etc...
        return new Default_VoteRepository_OfSomeType();
    }
}

Ben yeni Voteable öğeler düşmesi ve fabrikanın uygulanmasını dokunmadan, bu öğeler için depoları Oy vermek mümkün olmak istiyorum.

1 Cevap

Switch ifadesi dışında ise adlandırma aşağı temelde demektir. Nesnenin geçirilen bir sınıf almak ve yeni bir sınıf örneğini kullanabilirsiniz. Aşağıda basit bir örnek.

//pseudo code, untested
class Default_VoteRepositoryFactory
{
    public static function factory( Voteable $item, $arg1, $arg2 )
    {
        $parts = explode('_', get_class($item));
        $type  = array_pop();
        $class = 'Default_VoteRepository_' . $type;
        return new $class($arg1, $arg2);
        // autodiscover what type of repository this item needs
        // for instance, Default_User needs a Default_VoteRepository_User
        // etc...
    }
    //can be as complex or as simple as you need
    protected static function getType(stdClass $item)
    {
        $parts = explode('_', get_class($item));
        return array_pop($parts);       
    }
}