Bir üst sınıf, sadece çocuk var bir özellik başvurmak için uygun mu?

4 Cevap php

Benim takımım şu anda üzerinde çalıştığı projede, biz ticari bir PHP uygulama modifiye ediyoruz. App kod ile mayınları olduğu bir üst sınıf için kontroller gibi ve benzeri, üst sınıfında bulunmayan bir özelliği ile çalışır:

class A 
{
    function doSomething()
    {
        if (property_exists($this, 'some_property'))
        {
            $this->some_property = $_REQUEST['val'];
        }
    }

}

class B extends A
{
    protected $some_property;

    function doSomething()
    {
        parent::doSomething();
    }
}

Biz belli belirsiz kirli bu kodu değiştirmek zorunda hissediyorum; Bu doğru tasarım? Böyle bir şey önlenebilir (açık dışında) yolları nelerdir?

4 Cevap

Bir sınıfta bulunması gerekir yöntemleri güvenerek sürece soyut olarak ilan edebilir gibi, kirli değildir.

Ancak, güveniyor ve bir sınıfın dışında özellikleri işlemek için iyi bir uygulama değildir. Bu gibi soyut ayarlayıcıları kullanmak en iyisidir:

abstract class A 
{
    abstract protected function setSomeProperty($data);

    public function doSomething()
    {
        $this->setSomeProperty($_REQUEST['val']);
    }
}

class B extends A
{
    private $some_property;

    public function doSomething()
    {
        parent::doSomething();
    }

    protected function setSomeProperty($data)
    {
        $this->some_property = $data;
    }
}

Burada daha fazla bilgi: PHP Class Abstraction

Eğer ana sınıfını değiştirmek için alamayacağını söyledi beri However, ben bir Adapter ne üst sınıf "beklediği" gibi davranan bir alt yapım önermek, ve verecek bir Eğer "doğru" tasarlamak mümkün olacaktır sınıf.

Siz düşünün abstracting üst sınıf olabilir. Yani çocuklar olmalıdır yöntemleri ebeveyn ilan, ancak uygulanmadı.

Daha sonra çocuklar tarafından geçersiz kılınabilir üst sınıf bir sanal yöntem kanca oluşturabilirsiniz.

Ben tüm üyeler işlev doSomething sahip bir alt-sınıf, () oluşturmak için daha düzgün olduğunu düşünüyorum. Bu durumda (nihai kesmek ile) bir üst sınıfta bir çalışma değil işlevi oluşturmak, ama yine de genel "süper işlevi" yok.

class A 
{


}
class C extends A {

    protected $some_property;

    function doSomething()
    {
        $this->some_property = $_REQUEST['val'];
    }
}

class B extends C
{
    protected $some_property;

    function doSomething()
    {
        parent::doSomething();
    }
}