Bir PHP sınıfı kendi biri ile yöntemlerden birini veya ikisini geçersiz kılmak için en iyi ve en basit yolu olurdu verilen?

7 Cevap php

İşte objektif bulunuyor. Ben bir PHP sınıf var ve ben kendi ile geçersiz kılmak istiyorum yöntemlerinden bir veya iki vardır. Ben OOP (PHP ve genel olarak) anlamak gibi ben onu genişletir ve söz konusu yöntemlerin işlevselliğini geçersiz kılan bir çocuğun sınıf yazabilirsiniz.

Bu görevi ulaşmanın en iyi yoludur ve bu çocuk sınıflar için veya eğer bir doğru kullanımı ise PHP daha iyi bir şey yapmak ne çalışıyorum orada Ancak, eğer ben merak ediyordum.

7 Cevap

Ben burada sözü görmedim başka bir rota bir soyut sınıf ayıklamak ve iki sınıf olduğunu genişletmek için daha iyi olmaz sorgulamaktır. Tabii ki bunun için birinci sınıf kodunu değiştirmek mümkün olması gerekir (ei sınıf bir açık kaynak kitaplığı geldi eğer kodu değiştirmeden imtina olabilir).

Eğer doğru yolda

Evet, bunu yapmak için en iyi yoldur. Bir sınıf olarak uzanan bir fikri ya da daha fazla ilave belirli işlevleri sağlamaktır.

Evet. Bu tam olarak ne için devralma kullanın.

İyi bir ilke olsa, yeni türetilen sınıf "olan-bir" taban sınıf emin olun.

Gibi Human-a-Mammal. Alien İnsanlar yapmak bir sürü yapar sırf Alien extends Human yapmayın.

Yani, yöntemleri geçersiz kılmak için en iyi yolu (üst sınıfı uzanan gerektirir) ise baskın yöntemleri olduğunu soruyorsunuz? Evet.

Bu alt sınıflar en önemli kullanılmasıdır. Aslında, polimorfizm OOP kalbidir. Diğer kullanımı yeni özellikler / yöntemler sağlamaktır, ama bu genellikle yeterli olmayacaktır.

Eğer doğru yoldayız gibi geliyor.

Eğer geçersiz kılmak istediğiniz yöntemleri için, muhtemelen isterdim:

  • Eğer yöntemin amacını değişen değil emin olun
  • Eğer içinde temel sınıfın yöntemini çağırmak zorunda, ve ne zaman olmadığını bilmek

Diğer tek yolu, genel bir "süper sınıfı" oluşturmak olacaktır ...

class SuperClass {
    protected $obj = null;
    protected $overrides = array();

    public function __construct($obj) {
        if (!is_object($obj)) {
            throw new InvalidArgumentException('Argument is not an object');
        }
        $this->obj = $obj;
    }

    public function __call($method, $args) {
        $method = strtolower($method);
        if (isset($this->overrides[$method])) {
            array_unshift($args, $this);
            return call_user_func_array($this->overrides[$method], $args);
        } elseif (is_callable(array($this->obj, $method))) {
            return call_user_func_array(array($this->obj, $method), $args);
        } else {
            throw new BadMethodCallException('Invalid Method Called');
        }
    }

    public function __get($var) {
        return isset($this->obj->$var) ? $this->obj->$var : null;
    }

    public function __set($var, $value) {
        $this->obj->$var = $value;
    }

    public function addOverride($method, $callback) {
        $this->overrides[strtolower($method)] = $callback;
    }
}

Her zaman en iyi çözüm değil, ama bazı durumlarda böyle bir şey kullanmak için var olması mümkündür. Bu çalışma zamanında herhangi bir nesneye ve "geçersiz kılma" yöntemleri "eklemek" izin verir.

Daha iyi genel çözüm sadece bir çocuk sınıfta sınıfını genişletmek için ... Ama yukarıdaki "üst sınıf" bazı kullanımlarını var ...