Üst sınıftan alt sınıfları başlatmasını (PHP)

2 Cevap php

Ben bunu bir fabrika desen fonksiyonu ile bir sınıf var:

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

Çocuk sınıfta fabrika işlevi geçersiz kılma olmadan $child = Child::factory(); ve tercihen: ben çocuk fabrikası işlevini çağırın ve arama sınıfının bir örneğini döndürmesi gerekiyor.

Ben boşuna bu ulaşmanın birden fazla farklı yollar denedim. I __CLASS__ gibi, uzak yansıması kullanmak çözümleri kalmayı tercih ediyorum.

(Eğer bu konularda ben PHP 5.2.5 kullanıyorum)

2 Cevap

PHP 5.3 yükseltme Eğer (released 30-Jun-2009), bir çözüm sağlayabilir ki, late static binding check out:

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();

Benim düşünceme göre ne yapmaya çalışıyorsun hiçbir mantıklı.

Bir fabrika kalıbı bu şekilde çalışacak:

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');