PHP ООП абстрактные классы регистрация подкласса - PullRequest
0 голосов
/ 15 сентября 2018

У меня к вам абстрактный вопрос.

Вопрос: Как подкласс, расширяющий абстрактный класс, может зарегистрироваться в абстрактном классе или другом классе?

Проблема: Думаю, у нас есть мастер модулей с именем 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
{
}

Надеюсь, вы понимаете, о чем я, и можете помочь с этой абстрактной проблемой.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Вы, похоже, пытаетесь создать в родительском классе возможность, которая не является обязательной или неприемлемой в дочернем классе. Это противоположность наследования и, следовательно, анти-паттерн. Кроме того, даже если это можно рассматривать как расширение отражения, вы пытаетесь поместить данные времени выполнения в класс - это не то, для чего предназначены классы.

Вы также никоим образом не объяснили, что я могу понять , почему вы хотите это сделать.

Я подозреваю, что вы действительно хотите реализовать фабрику, стратегию или объект реестра.

0 голосов
/ 15 сентября 2018

Это очень странно в использовании.Вероятно, лучше иметь внешний реестр для вашего модуля.Но я думаю, что вы просите об этом:

Файл: 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 не будет знать, что ваш класс существует, если он еще не загружен в контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...