Instanciation olmadan süper sınıftan çocuk değişkenleri erişme

8 Cevap php

Ben örnekleme olmadan üst sınıf üzerinden bir çocuk sınıf üye değişkenleri erişmek için çalışılıyor.

Bu benim girişimleri biridir ama B::getStatic() Access to undeclared static property ile başarısız olur.

Muhtemelen statik olmadan bu başka bir çözüm var mı?

class A {

    static public function getStatic() {

        return self::$myStatic;

    }

}

class B extends A {

    public static $myStatic = 5;

}

class C extends A {

    public static $myStatic = 6;

}

var_dump(B::$myStatic);
var_dump(B::getStatic());

var_dump(C::$myStatic);
var_dump(C::getStatic());

8 Cevap

Eğer içine koşuyoruz kavram "Binding Geç Statik" denir. PHP 5.3.0 kadar bunun için hiçbir destek yoktu.

Eğer 5.3.0 veya daha yüksek çalışan ediyorsanız, getStatic () yöntemini güncelleme:

statik public function getStatic () {

return static::$myStatic;

}

Diğerleri doğru, yolu kod değişken derleme zamanında yok beri yapılamaz olduğunu.

Böyle bir şey yapmak için yolu soyut bir sınıf ile genellikle (PHP5 mevcuttur ve yukarı, bu gibi görünüyor).

Sınıf A soyut sınıf olur ve getStatic () işlevi olurdu. Sınıflar B ve C A genişletmek ve getStatic () fonksiyonu tanımları olurdu. Bu şekilde, getStatic çağırdığınızda () Eğer A'da tanımı yoktur beri alt sınıfı tanımlar değerini alacak

Bu yaklaşımın ihtar o soyut yana A örneğini edemezler. Sen DAİMA B veya bir C (ya da bir alt sınıf-of) yapmak gerekir.

Ayrıca A bir ayarlayıcı yapmak ve alt sınıfları (yerine '=' s) değerini ayarlamak için kullanabilirsiniz olabilir. Yani A örneğini izin istiyorum ve hiç ihtiyacı eğer değerini ayarlayabilirsiniz. Bunu alt sınıfları PHP özel fonksiyonları kullanabilirsiniz eğer ben bilmiyorum, doğrudan denilen olamaz bu yüzden setter özel yapmak mümkün olabilir.

Sen fonksiyonu ve değişken beyanı arasında bir uyumsuzluk var.

Eğer B fonksiyonunun beyanı taşımak gerekir ya

veya

A. değişkenin deklarasyonu hareket

B sınıfı yerine ters sınıfı A özelliklerini devralır.

Neden B::$myStatic sizin örnekteki gibi kullanmak değil mi?

Sizin yöntem A getStatic A'da bulunmayan bir değişkene erişemezsiniz içine A. myStatic taşımak zorunda

Kimden PHP manual:

Static references to the current class like self:: or __CLASS__ are resolved using the class in which the function belongs, as in where it was defined:

Eğer, getStatic() üzerine B veya C o a::$myStatic dönmek için çalışıyor çağırdığınızda yöntem A'da tanımlanan Yani çünkü farkeder ki 't var. O var olsalar bile sen sadece bir sınıfta geçersiz kılınmış değeri, geri o değer değil olacaktı.

Bir çözüm Geç Statik Bağlar olduğunu, ancak bu henüz serbest değildir PHP 5.3 kullanılabilir.

$myStatic A sınıfı statik ilan edilmelidir: here bakın.

class A {
    public static $myStatic = 5;
}    
class B extends A {
    public static $myStatic = 3;
}
class C extends A {
    public static $myStatic = 1;
}

Sonra sadece B :: $ myStatic kullanabilirsiniz ...