2017-06-16 69 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