Hala üst sınıftan erişim sağlarken kamu erişimi kısıtlayan bir şekilde sınıfta kamu yöntemini geçersiz kılın?

1 Cevap php

Ben kamu alıcı çeşitli yöntemler ile, bir genel Toplama sınıf var.

Koleksiyonu'ndan bir öğe almak için, () olsun diyoruz. GetMany (), GetRange (), GetAll (), (bulmak), findAll (), sorgu (), queryAny (), vb: Birden fazla ürün iade çeşitli yöntemler de vardır

Dahili olarak, birden fazla ürün iade bu yöntemlerin hepsi dönmek için tek tek öğeleri toplamak gibi, tekrar tekrar get () çağıran bir döngü var.

Basitleştirilmiş bir örnek:

public function get($key){
    return $this->collection[$key];
}

public function getMany($keys){

    $many = array();

    foreach ($keys as $key){
        $many[] = $this->get($key);
    }

    return $many;
}

Ben müşteri Koleksiyonu'ndan tek bir öğeye erişmek mümkün istemiyorum böyle bir şekilde Koleksiyonu genişletmek istediğiniz zaman sorun ortaya çıkar. Temelde, get () yöntemine erişimi engellemek istiyorum.

Bu üst sınıf kamu çünkü ben, get (), bir özel veya korumalı işlev yapamaz.

Tüm diğer yöntemler get () güveniyor çünkü ben de bu fonksiyonel olmayan (yani sadece bir dönüş ile geçersiz veya bir istisna yapar) böyle bir şekilde get () kılamaz, ve ben bunları istiyorum işlevsel kalır.

Ben sadece bazı yeni korumalı yöntemi (yani getOne ()) dayanmak get () güveniyor tüm yöntemlerini geçersiz olabileceğini biliyorum, ama bu KURU ilkelerini ihlal eder.

WHAT I DON'T WANT TO DO:

class DataSet extends Collection{

    public function get(){
        throw new Exception('get() not implemented in DataSet');
    }

    protected function getOne($key){
        return parent::get($key);
    }    

    public function getMany($keys){

        $many = array();

        foreach ($keys as $key){
            $many[] = $this->getOne($key);
        }

        return $many;
     }
}

Ben yukarıda yaptım, ben bir yarım düzine yöntemleri (oldukça karmaşık olan bazı) geçersiz olurdu ve onlar sadece birkaç karaktere göre üst sınıf 'yönteminden farklı olurdu.

Yani ... Ben ne başka seçenekler var? Aynı sona farklı anlamı vardır ...?

1 Cevap

Neler yapabileceğini protected yöntem _get söylemek yapmak ve bu tüm yöntemler dahili dediğimiz olabiliyor. Daha sonra erişim ihtiyacınız olan tüm sınıfları bir get yöntemi duyurmak ve sadece _get çağrı olabilir.