Neden PHP soyut sınıflardan soyut işlevleri çağırmak değil mi?

3 Cevap php

Ben soyut bir üst sınıf, ve onu genişleten bir beton sınıfı kurdum. Neden üst sınıf soyut işlevini çağırmak değil mi?

//foo.php
<?php
    abstract class AbstractFoo{
        abstract public static function foo();
        public static function getFoo(){
            return self::foo();//line 5
        }
    }

    class ConcreteFoo extends AbstractFoo{
        public static function foo(){
            return "bar";
        }
    }

    echo ConcreteFoo::getFoo();
?>

Hata:

Ölümcül hata: 5. satırdaki foo.php soyut yöntem AbstractFoo :: foo () arayamıyorum

3 Cevap

Bu doğru bir uygulama olduğunu; Kullanmak amacıyla, statik, kendini kullanmanız gerekir late static bindings:

abstract class AbstractFoo{
    public static function foo() {
        throw new RuntimeException("Unimplemented");
    }
    public static function getFoo(){
        return static::foo();
    }
}

class ConcreteFoo extends AbstractFoo{
    public static function foo(){
        return "bar";
    }
}

echo ConcreteFoo::getFoo();

beklenen "bar" verir.

Bu gerçekten polimorfizmi olmadığını unutmayın. Statik Keywork sadece statik yöntemi çağrıldı hangi sınıfa çözümlenir. Soyut bir statik yöntem bildirirseniz, sıkı bir uyarı alırsınız. PHP sadece kopya ebeveyn (süper) sınıfı tüm statik yöntemler de çocuğun (alt) sınıf var yoksa.

O kelimeyi self fark?

Bu abstractclass işaret ediyor. Böylece () değil, ConcreteClass abstractclass :: foo çağırıyor :: foo ();

PHP 5.3 geç statik bağlamalarını sağlayacak inanıyorum, ama bu sürüm üzerinde değilseniz, kendini uzun bir sınıfa başvurmak olmaz, ancak fonksiyon in bulunduğu sınıf

Bkz: http://us.php.net/manual/en/function.get-called-class.php

Bu bir kural olduğunu abstract ve static anahtar kelime aynı zamanda bir yöntem üzerinde kullanım olamaz.

Bir abstract anahtar kelime ile bir yöntem alt sınıf uygulamak gerektiği anlamına gelir. Bir sınıfın bir yöntem statik ekleyerek bize bunu başlatmasını olmadan yöntemi kullanmanıza olanak sağlar.

Hata oluşur yüzden olmasıdır.