statik sınıf PHP çalışmıyor inheritant?

4 Cevap php
abstract class base {
    abstract public function test();
    public function run()
    {
        self::test();
    }
}

class son extends base {
    public function test()
    {
        echo 1;
    }
}
son::run();

Bu raporlar:

Fatal error: Cannot call abstract method base::test()

Ama son::test() neden ve düzeltmek için bir yol var, çalışıyor?

4 Cevap

"Öz" lexically Eğer Base bir yöntem, "öz" in "kendi kendine" kullanırsanız yani olursa olsun, çalışma zamanında bu yöntemi çağırın, nasıl "Base" anlamına, kapsamlı. PHP5.3 ironik, "statik" denir, dinamik bağlama yeni bir tür tanıttı. Php 5.3 beklendiği gibi aşağıdaki işler

abstract class base {
    abstract public static function test();
    static public function run()
    {
        static::test();
    }
}

class son extends base {
    static public function test()
    {
        echo 1;
    }
}
son::run();

Tabii ki:

Ölümcül hata: arayamaz abstract yöntemi baz :: test ()

Bu diyebileceğimiz hiçbir yöntem gövdeye sahip. Çalıştırırsanız (), bir Template Method, sen $this yerine self ile sınıf kapsamına bakın ve sonra da aranacak $ oğlunun bir örneğini oluşturmak olması gerekiyordu örneğin, bunun üzerine () çalıştırın

abstract class BaseClass {
    abstract public function test();
    public function run()
    {
        $this->test();
    }
}

class Son extends BaseClass {
    public function test()
    {
        echo 1;
    }
}

$son = new Son;
$son->run(); // 1

o zaman sen de iyi denir testi () doğrudan olabilir, çünkü, hangi oldukça garip.

Ayrıca örnekte dikkat

son::run();

run () metodu static ilan edilmez ve PHP yine run () yürütmek olurken, yanlış kullanım olarak kabul edilir ve bir E_STRICT hata yükseltmek, çünkü yanlış. Ancak, (run tanımlamak için olsaydı) statik, yaparsın artık referans $this, statik bir yöntem örneği kapsamından çağrılan, ancak sınıf kapsam değil çünkü.

Edit Ben PHP5.3 çözüm eklemek, ama ben yazarak iken bu @ erenon zaten yaptım görmek üzereydi, bu yüzden ben sadece [(1)] {üzerinde PHP Kılavuzunda uygun başvuru ekleyin }.

Abstract methods bir uygulaması yok ve dolayısıyla denilen olamaz. Yöntem soyut olarak tanımlanan, aslında bir uygulama var ise, o zaman kod ile idam edilebilir. Örneğin:

public function test(){
    echo "Hello from base!";
}

Fabrika / tekiz desen karışımı:

class Base
{
    static private $instance;

    static function getSon() {
        if (null === self::$instance) {
            self::$instance = new Son;();
        }

        return self::$instance;
    }
}

class Son
{
    public function test() {
        echo 1;
    }
}

Base::getSon()->test(); //1