2017-06-16 117 views
-2

我有一個繼承問題。考慮我有一個父類A和一個來自A的派生類B以及一個來自A的派生類C。PHP OOP繼承問題

比方說,從A類B類&下,兩個覆蓋方法種子()也clases一個&乙& C中的所有實現一個靜態函數seedAll()。

我的問題是:我如何打電話seedAll對於B & C來自A的seedAll功能,無需顯式指定B類& C,因此,在未來,我應該有類似於B類&下的類d ,我不需要修改類A的seedAll函數來調用類B的seedAll功能,C & D.

abstract class A 
{ 
    public static function seedAll() { 
     //How do I call seedAll of all the derived classes of Seeder? 
    } 

    abstract protected function seed(); 
    // // Common method 
    // public function printOut() { 
    //  print $this->getValue() . "\n"; 
    // } 
} 

class B extends A 
{ 
    private $name; 

    function __construct($name) { 
     $this->name = $name; 
    } 

    public static function seedAll() { 
     $seeder1 = new B("name1"); 
     $seeder1 = new B("name2"); 
    } 

    function seed() { 
     echo $this->name; 
    } 
} 


    class C extends A 
    { 
     private $name; 

     function __construct($name) { 
      $this->name = $name; 
     } 

     public static function seedAll() { 
      $seeder1 = new C("name1"); 
      $seeder1 = new C("name2"); 
     } 

     function seed() { 
      echo $this->name; 
     } 
    } 
+1

它不應該是一個靜態方法,如果這取決於哪個對象是從調用它。 – Barmar

+0

哪一個不應該是靜態方法,基類的靜態方法還是派生類的靜態方法?你能更清楚嗎? – Hirvesh

+1

'seed()'方法如何與此相關?你可以顯示代碼,以及你試圖得到什麼結果? – Barmar

回答

2

how to obtain all subclasses of a class in php如何讓所有的子類。然後你可以循環它們並調用它們的方法。

abstract class A 
{ 
    public static function seedAll() { 
     $subclasses = getSubclassesOf("A"); 
     foreach ($subclasses as $class) { 
      $class::seedAll(); 
     } 
    } 

    abstract protected function seed(); 
    // // Common method 
    // public function printOut() { 
    //  print $this->getValue() . "\n"; 
    // } 
} 

getSubclassesOf功能:

function getSubclassesOf($parent) { 
    $result = array(); 
    foreach (get_declared_classes() as $class) { 
     if (is_subclass_of($class, $parent)) 
      $result[] = $class; 
    } 
    return $result; 
} 
+0

有些注意事項:(1)使用自動加載意味着調用這個函數時可能不知道某些類(2)如果OP忘記在任何子類中實現'seedAll',那麼這將導致無限遞歸。然而OP要求這樣做,因此這是一種「買方當心」的情況。 – apokryfos

+0

@apokryfos謝謝你!我會記住這一點 – Hirvesh

+0

@Barmar我會將您的答案標記爲已接受,但我發現getSubclassesOf函數不是PHP標準庫的一部分。 – Hirvesh