我有一个抽象的问题。
问题:扩展抽象类的子类如何将自身注册到抽象类或另一个类?
问题:猜猜我们有一个名为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
{
}
我希望你理解我的意思,并能帮助解决这个抽象问题。
使用起来非常奇怪。为您的模块安装外部注册表可能是更好的设计。但我认为你要求这个:
文件: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将不知道您的类是否存在。
您似乎正在尝试在父类中创建一个在子类中不需要或不适合的功能。这与继承相反,因此是反模式。此外,即使它可能被视为反射的扩展,您也试图将运行时数据放在一个类中 - 这不是类的用途。
您也没有以任何方式解释我能理解您为什么要这样做。
我怀疑你真的想要实现工厂,策略或注册表对象。