Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP继承问题_Php_Oop_Inheritance - Fatal编程技术网

PHP OOP继承问题

PHP OOP继承问题,php,oop,inheritance,Php,Oop,Inheritance,我有继承权问题。考虑到父类A和派生类B从一个派生类C到另一个。 比方说,类B&C都重写了类A中的方法seed()。还将类A&B&C全部实现一个静态函数seedAll() 我的问题是:如何从A的seedAll函数调用B&C的seedAll而不显式指定类B&C,这样将来,如果我有一个类似于类B&C的类D,我就不需要修改类A的seedAll函数来调用类B、C&D的seedAll函数 abstract class A { public static function seedAll() {

我有继承权问题。考虑到父类A和派生类B从一个派生类C到另一个。

比方说,类B&C都重写了类A中的方法seed()。还将类A&B&C全部实现一个静态函数seedAll()

我的问题是:如何从A的seedAll函数调用B&C的seedAll而不显式指定类B&C,这样将来,如果我有一个类似于类B&C的类D,我就不需要修改类A的seedAll函数来调用类B、C&D的seedAll函数

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;
        }
    }
有关如何获取所有子类的信息,请参见。然后,您可以循环它们并调用它们的
seedAll()
方法

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";
    // }
}
GetSubassesof函数:

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

如果它取决于调用它的对象,那么它不应该是静态方法。哪个不应该是静态方法,基类的静态方法还是派生类的静态方法?你能更清楚一点吗?
seed()
方法与此有什么关系?你能展示代码吗?你想得到什么结果?@Barmar,我更新了描述并输入了代码。如果你能帮助我,我将不胜感激。这是。没有OOP方法可以做到这一点。一些警告:(1)使用自动加载意味着调用此函数时可能不知道某些类(2)如果OP忘记在任何子类中实现
seedAll
,则这将导致无限递归。但是OP要求这样做,所以这是一种“买家小心”的情况。@Barmar我会将您的答案标记为已接受,但我发现GetSubassesof函数不是PHP标准库的一部分。对。这是我链接到的问题。@Barmar非常感谢您的帮助和时间!