PHP OOP抽象类子类注册

问题描述 投票:1回答:2

我有一个抽象的问题。

问题:扩展抽象类的子类如何将自身注册到抽象类或另一个类?

问题:猜猜我们有一个名为ModuleMaster的模块主人,也许还有其他人编写了另一个模块来处理特定问题,而无需修改主类并命名为ModuleA。出于这个原因,我们希望实现问题解决方案的动态加载。

我的想法:

文件:Extensions.php:

namespace Project\Extensions;

class Extensions
{
    public function getLoadedModules()
    {
        var_dump(ModuleMaster::LOADED_MODULES);
    }
}

文件:Modules \ ModuleMaster.php:

namespace Project\Extensions\Modules;

abtract class ModuleMaster
{
    public const LOADED_MODULES = array();
}

文件:Modules \ ModuleA.php:

namespace Project\Extensions\Modules;

class ModuleA extends ModuleMaster
{
}

我希望你理解我的意思,并能帮助解决这个抽象问题。

php oop abstract-class
2个回答
0
投票

使用起来非常奇怪。为您的模块安装外部注册表可能是更好的设计。但我认为你要求这个:

文件:Extensions.php:

namespace Project\Extensions;
use \Project\Extensions\Modules\ModuleMaster;

class Extensions
{
    public function getLoadedModules()
    {
        var_dump(ModuleMaster::getLoadedModules());
    }
}

文件:Modules \ ModuleMaster.php:

namespace Project\Extensions\Modules;

abstract class ModuleMaster
{
        public static function getLoadedModules() {
                $parent = self::class;
                return array_values(array_filter(\get_declared_classes(), function ($class) use ($parent) {
                        return in_array($parent, class_parents($class));
                }));
        }
}

文件:Modules \ ModuleA.php:

namespace Project\Extensions\Modules;
use \Project\Extensions\Modules\ModuleMaster;

class ModuleA extends ModuleMaster
{
}

使用示例:

$e = new \Project\Extensions\Extensions;
$e->getLoadedModules();

示例结果:

array(1) {
  [0]=>
  string(34) "Project\Extensions\Modules\ModuleA"
}

请注意,只有在运行getLoadedModules()之前所有类文件都包含在上下文中时,代码才有效。如果它尚未加载到上下文中,PHP将不知道您的类是否存在。


0
投票

您似乎正在尝试在父类中创建一个在子类中不需要或不适合的功能。这与继承相反,因此是反模式。此外,即使它可能被视为反射的扩展,您也试图将运行时数据放在一个类中 - 这不是类的用途。

您也没有以任何方式解释我能理解您为什么要这样做。

我怀疑你真的想要实现工厂,策略或注册表对象。

© www.soinside.com 2019 - 2024. All rights reserved.