Bu örneğe bir göz atın, ve belirtilen çıkışları dikkat edin.
<?php
class Mommy
{
protected static $_data = "Mommy Data";
public static function init( $data )
{
static::$_data = $data;
}
public static function showData()
{
echo static::$_data . "<br>";
}
}
class Brother extends Mommy
{
}
class Sister extends Mommy
{
}
Brother::init( "Brother Data" );
Sister::init( "Sister Data" );
Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data
?>
Benim anlayış static anahtar sözcüğünü kullanarak çocuk sınıfına bakın ki, ama çocuk sınıfından eksik olduğunda görünüşte sihirli bir üst sınıf için de geçerlidir. (Bu, daha aşağıda açıklanmıştır üzerine, PHPiçin tehlikeli bir davranış türüdür.)
Ben bunu neden yapmak istediğiniz için aklında iki şey vardır:
- Ben çocuk sınıflar tüm özellikleri tüm tanımlama fazlalık istemiyorum.
- Ben özellikleri üst sınıf varsayılan olarak tanımlanabilir istiyorum ve ben çocuk sınıf tanımı gerektiği yerde bu özellikleri geçersiz kılmak mümkün olmak istiyorum. Sınıf çocuk varsayılan amaçlanan zaman ben yukarıdaki örnekte çocuk derslerinde özelliklerini tanımlamak yok neden, hangi özelliklerini dışlamak gerekiyor.
Biz (init yöntemi ile) zamanında bir özellik geçersiz kılmak isteyen varsa Ancak, üst sınıf için geçersiz olacak! Bu noktadan itibaren, daha önceki (Brother durumunda olduğu gibi) başlatılmış çocuk sınıflar beklenmedik sana değiştirin.
Görünüşe göre bu açıkça çocuk sınıf içinde tanımlı değil her çocuk sınıflar statik özelliği kendi kopyasını sahip olmayan bir sonucudur - ama yerine bir hata atma ulaşmanın static davranışını anahtarları ana. Bu nedenle, is there some way that the parent class could dynamically create a property that belongs to the child class without it appearing inside of the child class definition? çocuk sınıfın statik özelliği kendi kopyasını ve statik anahtar kelime olabilir Bu şekilde düzgün ona bakın, o hesap ana özellik varsayılan içine almak için yazılmış olabilir.
Veya başka bir çözüm, iyi, kötü ya da çirkin, var mı?