Вопрос про правильное использование interface и implements?

Есть несколько классов (по классу на источник), содержащих однотипные функции, например парсинг:
Количество и название классов изначально не известно.

Подсказали копать в сторону общий интерфейс и работа с источниками полиморфно.
В итоге получился код ниже.

Как правильно их организовать в плагинах? С подключением в виде одного файла на класс?



interface Parser
{
    public function getPrograms();
}

class Source1Parser implements Parser
{
    public function getPrograms()
    {
        return 1;
    }
}

class Source2Parser implements Parser
{
    public function getPrograms()
    {
        return 2;
    }
}


class PluginTvh4_ActionSources extends ActionPlugin

protected function EventImport()
    {
        foreach (get_declared_classes() as $aDeclaredClasses) {
            if (preg_match("/^Source/", $aDeclaredClasses)) {
                $parser[] = new $aDeclaredClasses();
            }

        }
        foreach ($parser as $program) {
            echo $program->getPrograms();
        }


6 комментариев

avatar
Не до конца понял, что именно требуется.
Например, для Entity можно сделать так (чтобы автозагрузка работала без доработок):
1. создать интерфейс в модуле Source /entity/InterfaceParser.entity.class.php
<?php

interface PluginTvh4_ModuleSource_EntityInterfaceParser
{
    public function getPrograms();
}

2. далее уже создать нужное количество конкретных реализаций, например, /entity/ParserSport.entity.class.php
<?php

class PluginTvh4_ModuleSource_EntityParserSport extends Entity implements PluginTvh4_ModuleSource_EntityInterfaceParser
{

}

Если потребуется, то часть с extends Entity можно опустить.
Далее работа с Entity не отличается от обычного использования плагина.
  • ort
  • +1
avatar
Каким образом можно получить список всех реализаций?
avatar
Прочитать список файлов в /entity/ по маске Parser[*].entity.class.php
avatar
Классы подключил, в foreach (get_declared_classes() as $aDeclaredClasses) их вижу, но все равно не понимаю как мне вызвать getPrograms() например из первого.
avatar
Не знаю насколько костыльно, но так заработало:

        foreach (get_declared_classes() as $aDeclaredClasses) {
            if (preg_match("/_EntityParser/", $aDeclaredClasses)) {
                $ParserSource[] = new $aDeclaredClasses;
            }
        }

        foreach ($ParserSource as $program) {
            echo $program->getPrograms();
        }
avatar
Создавать объект Entity нужно так:
$oParser=Engine::GetEntity('PluginTvh4_ModuleSource_EntityParserSport');
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.