【问题标题】:PHP OOP inheritance issuePHP OOP 继承问题
【发布时间】:2017-06-16 16:03:22
【问题描述】:

我有一个继承问题。假设我有一个父类 A 和一个来自 A 的派生类 B 和一个来自 A 的派生类 C。

假设 B 类和 C 类都覆盖了 A 类的方法 seed()。A 类和 B 类和 C 类都实现了一个静态函数 seedAll()。

我的问题是:如何在没有明确指定 B 和 C 类的情况下从 A 的 seedAll 函数调用 B&C 的 seedAll,以便将来我应该有一个类似于 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;
        }
    }

【问题讨论】:

  • 它不应该是一个静态方法,如果它取决于你从哪个对象调用它。
  • 哪个不应该是静态方法,是基类的静态方法还是派生类的静态方法?能说清楚一点吗?
  • seed() 方法与此有何关系?你能展示一下代码吗?你想得到什么结果?
  • @Barmar,我更新了描述并放了代码。如果你能帮助我重新,我将不胜感激。这个。
  • 没有 OOP 方法可以做到这一点。

标签: php oop inheritance


【解决方案1】:

请参阅how to obtain all subclasses of a class in php 了解如何获取所有子类。然后,您可以遍历它们并调用它们的 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";
    // }
}

getSubclassesOf 函数:

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

【讨论】:

  • 一些注意事项:(1) 使用自动加载意味着在调用此函数时可能不知道某些类 (2) 如果 OP 忘记在任何子类中实现 seedAll 那么这将导致无限递归.然而 OP 要求它,所以这是一种“买家当心”的情况。
  • @Barmar 我会将您的答案标记为已接受,但我发现 getSubclassesOf 函数不是 PHP 标准库的一部分。
  • 对。这是我链接到的问题。
  • @Barmar 非常感谢您的帮助和时间!
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 2013-02-11
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2016-06-25
相关资源
最近更新 更多