PHP statik üyeleri Kalıtım

2 Cevap php

Statik bir özellik üst sınıfında tanımlanmış ise PHP, bir çocuğun sınıfta geçersiz kılınamaz. Bu etrafında herhangi bir yolu var ama eğer ben merak ediyorum.

Ben başkasının (biraz aksak) fonksiyonu için bir sarıcı yazmaya çalışıyorum. Söz konusu işlevi farklı veri tiplerinin çok uygulanan ama her biri için farklı bayraklar ve seçenekleri gerektirir. Fakat% 99, her bir tür için varsayılan bir yeterli olacaktır.

Bu miras ile yapılabilir eğer yeni fonksiyonlar her zaman yazmak zorunda kalmadan, güzel olurdu. Örneğin:

class Foo {
    public static $default = 'DEFAULT';

    public static function doSomething ($param = FALSE ) {
        $param = ($param === FALSE) ? self::$default : $param;
        return $param;
    }
}

class Bar extends Foo {
    public static $default = 'NEW DEFAULT FOR CHILD CLASS';
}

echo Foo::doSomething() . "\n"; 
// echoes 'DEFAULT'

echo Bar::doSomething() . "\n"; 
// echoes 'DEFAULT' not 'NEW DEFAULT FOR CHILD CLASS' 
// because it references $default in the parent class :(

2 Cevap

Globalleri (bu durumda fonksiyonları) gibi statik kullanılarak neden klasik bir örnek olursa olsun dili kötü bir fikirdir.

En sağlam yöntem, soyut bir taban "Eylem" sınıfın birden çok uygulama alt sınıflar oluşturmak için.

Sonra denemek ve sadece yöntemlerini çağırmak için sınıfının bir örneği başlatılırken sıkıntı bazı kaldırmak için, bazı tür bir fabrikada sarın.

Örneğin:

abstract class AbstractAction {
  public abstract function do();
}

class FooAction extends AbstractAction {
  public function do() {
    echo "Do Foo Action";
  }
}

class BarAction extends AbstractAction {
  public function do() {
    echo "Do Bar Action";
  }
}

Sonra fonksiyonunun oluşturulabilmesi de "yardım" için bir fabrika oluşturmak

class ActionFactory {
  public static function get($action_name) {
    //... return AbstractAction instance here
  }  
}

: O olarak kullanmak

ActionFactory::get('foo')->do();

Önümüzdeki PHP 5.3.0 sürümü late static binding, hangi yardımcı olabilir içerir. Bu özelliği kullanarak, statik bir yöntem içinde bir statik değişkeni kullanın ve "doğru" yöntemini bulma geç statik bağlama take dikkat izin verebilir.

class Foo {
    public static function getDefault() {
        static $default = 'DEFAULT';
        return $default;
    }
    public static function doSomething ($param) {
        $default=static::getDefault(); // here is the late static binding
        $param = ($param === FALSE) ? $default : $param;
        return $param;

    }
}

class Bar extends Foo {
     public static function getDefault() {
        static $default = 'NEW DEFAULT FOR CHILD CLASS';
        return $default;
    }
}