модульная архитектура

sbazz

Guest
модульная архитектура

Задача:

Есть набор плугинов со стандартным интерфейсом (вариант реализации по большому счету любой, но для конкретности это функция start) и ядро, которые енти самые плугины подключает с использованием include_once.

Тем кто еще не понял суть вопроса:
при количестве модулей более одного выдается предупреждение о переопределении функции start, что собственно логично.. Функция сама по себе необходима для передачи параметров интерфейсу.

Пробовал реализовывать через ООП:

1. Класс интерфейса с функцией start($parameters) в плугине:

PHP:
class PluginInterface
{
     function start($parameters)
     {
            echo "Plugin enabled";
     }
}
2. Далее код вызова плугина:

PHP:
include_once("plugin.php");
$plugin = new PluginInterface;
$plugin->start($parameters);
3. При выполнении:

PHP:
Plugin enabled
Fatal error: Cannot redeclare class plugininterface in ...
Ну и как сделать подключение стандартного интерфейса?

З.Ы. Кстати интересно, а зачем енто PHP переводит имена переменных в нижний регистр? :) Умаляет художественный талант их создателя? :D
 

tony2001

TeaM PHPClub
еще раз, плз, но более четко.
функция? метод? класс? все смешалось.

>З.Ы. Кстати интересно, а зачем енто PHP переводит имена переменных в нижний
>регистр? Умаляет художественный талант их создателя?
"енто" - затем, что PHP хранит имена классов нижнем регистре, т.к. class teST и class TeSt - это один и тот же класс.
 

SiMM

Новичок
Re: модульная архитектура

Автор оригинала: sbazz
PHP:
$plugin = new PluginInterface;
$plugin = start($parameters);
Этот start - не метод класса PluginInterface. Или так и задумано и так и должно быть?
PS: и, кстати, PHP ничего не "умаляет".
 

Frol

Новичок
видно, что ООП употребляется из-за красоты самого слова.
 

.R1

Новичок
Во-первых, не исключено, что подключение plugin.php происходит по-разному:

Замечание: Be aware, that the behaviour of include_once() and require_once() may not be what you expect on a non case sensitive operating system (such as Windows). Пример 11-9. include_once() is case insensitive on Windows

PHP:
<?php
include_once("a.php"); // this will include a.php
include_once("A.php"); // this will include a.php again on Windows!
?>

Во-вторых, подключение одного файла могло происходить разными функциями:
PHP:
include_once();
PHP:
require_once();
Ну а про вызов "метода" я вообще молчу...
 

sbazz

Guest
to .r1, vovchik542: исправил.

to Frol: ваши комментарии без комментариев.

to tony2001:

Кратко структура:

Модуль 1 ("ядро") вызывает модуль 2 ("плагин"), определяющий в себе класс "PluginInterface" c методом "start".

В процессе выполнения в модуле 1 ("ядро") создаю объект от "PluginInterface". Вызываю его метод "start".

При количестве модулей типа "плагин" больше 2 вижу предупреждение о переопределении класса "PluginInterface".

Собственно непонятно как делать вообще модульную структуру тогда (не имея ввиду include и require).
 

jonjonson

Guest
sbazz, ты изобретаешь этот велосипед?
PHP:
// В отдельном файле
class PluginInterface
{ 
     function start($parameters) { 
            echo $parameters . '<BR />';
     } 
}
// В отдельном файле
class NewsPlugin extends PluginInterface
{
    function NewsPlugin () {   
        $parameters = "News Plugin enabled";
        parent::start($parameters);
    }
}
// В отдельном файле
class ArticlesPlugin extends PluginInterface
{
    function ArticlesPlugin () {
        $parameters = "Articles Plugin enabled";
        parent::start($parameters);
    }
}
// Инклудим файлы
$news = &new NewsPlugin();
$articles = &new ArticlesPlugin();
 

Frol

Новичок
sbazz
совет без комментариев.
изучить ООП, а потом его использовать.
 

sbazz

Guest
to jonjonson:

Почти твой велосипед изобретаю. Только с одним отличием:

PHP:
class NewsPlugin и class ArticlesPllugin
- а если плугинов много и мы не знаем для каждого имя класса, а хотим
использовать стандартные методы доступа к каждому?

Ситуация более конкретно:

- Эти плагины являются обработчиками документов различного типа: xml-документы, xslt, html, doc, xls, и прочие (всего порядка 10), а также различного содержания: отчет, заявление и масса других. В дальнейшем планируется расширять систему документооборота (более конкретно - некоторым пакетом документов "1С"). Собственно за счет такого разнообразия документов, необходимости структуированно выводить каждый и возможности расширения и возникла необходимость в таком подходе.

-~{}~ 08.01.05 12:58:

to Frol:

Судя по Вашим весьма аргументированным замечаниям,
Вы - большой специалист в области ООП. Не могли бы Вы, если
Вас конечно не затруднит, предложить решение моей простейшей задачи?

Да и по каким признакам Вы определили меня как человека, которому неведом ООП?

Напишите пожалуйста, я безпрекословно учту Ваши заметки в своей каждодневной работе и тогда, следуя Вашему совету, непременно изучу концепцию ООП.
 

Frol

Новичок
я говорю вполне серьезно.
для Вашей "проблемы":
- а если плугинов много и мы не знаем для каждого имя класса, а хотим
использовать стандартные методы доступа к каждому?
в ООП используется один термин.
 

sbazz

Guest
я тоже серьезно. Поясняю:

- плугин в данном случае - не обязательно класс. Это может быть набор функций или вообще кусок кода. НО! Для взаимодействия с "ядром" ему необходим интерфейс, который и предоставляется с помощью "PluginInterface". Если бы изъяснятся точнее, то PluginInterface - это класс, обеспечивающий доступ к стандартной функциям плугина.

Да я не совсем корректно обозвал его интерфейсом, но сделал я это вполне осознанно, т.к. данный класс выполняет задачу взаимодействия между структурами.
 

Screjet

Новичок
sbazz,
вопрос на засыпку, типы этих самых обработчиков одинаковые?
или разные?
если разные, то и называй их по разному и не заморачивайся, типа:
_class_name_.class.php >> class _class_name_ {}
 

Frol

Новичок
объявляем этот самый PluginInterface со списком основных методов.
дальше делаем на каждый тип документа свой класс, в котором реализуем PluginInterface.
а реализовываем его с помощью "набора функций".
 

jonjonson

Guest
Автор оригинала: sbazz
- а если плугинов много и мы не знаем для каждого имя класса, а хотим
использовать стандартные методы доступа к каждому?
Стандартные методы доступа? Так и называй стандартно одни и теже методы.
PHP:
class A
{
    function IsPlugin () {
        return true;
    }
}
class B
{
    function IsPlugin () {
        return true;
    }
}
class C
{
    function IsPlugin() {
        return true;
    }
}
Не знаите имя плагина? Гм, а как же вы его использовать собираетесь? В любом случае для создания объекта вам придеться вспомнить имя.

Если же плагины реализуются не только как классы, то тогда вообще я не вижу общего способа работы с ними. И привязка кода плагинов к модулям вовсе не создает общего интерфейса.

А вообще, прочтя написанное тобой понял, что ты сам не понимаешь что делаешь.
 

sbazz

Guest
Нет. Плугины разные. Класс один PluginInterface. Каждый плагин в себе содержит, для примера, функцию start($parameters). Необходимо так реализовать функцию вызова плугинов, чтобы вызывать функцию start каждого из плугинов.

То есть:

PHP:
//Плугин 1
function start($parameters)
{
      echo "plugin 1";
}

//Плугин 2
function start($parameters)
{
      echo "plugin 2";
}

//Ядро (отдельный файл)

include_once("plugin1.php");
start($parameters);
include_once("plugin2.php");
start($parameters);

Явно, что так всегда (и при использовании объектов) будет одно и то же: переопределение. 

Но как реализовать..у меня мыслей не возникает.. :(

Вообще если подумать получается, что это вообще невозможно. Хотя:

1) Как же тогда вообще реализуются такого плана системы.
(яркий пример Photoshop)

2) Или это проблема неразрешимая?

Например, в Delphi можно такие вещи реализовать с помощью динамически подключаемых библиотек (хотя и с некоторыми сложностями - можно было определить функцию как содержащуюся в dll, а для полноты картины - набор функций).

? Терзает смутное сомнение, что я просто чего-то не понимаю (например ООП, по словам Frol'a). May be, may be..
 

SiMM

Новичок
Твоё сомнение, ИМХО, более чем оправдано. Почитай что-нибудь для начала об ООП - то, что пишешь ты - даже внешне на ООП не похоже - поскольку ты опять же показываешь вызов каких-то функций, к классам никакого отношения не имеющих. Да и инклудишь далеко не классы (по крайней мере - этого не видно).
 

sbazz

Guest
Как инклудить классы тогда?

-~{}~ 08.01.05 15:45:

А насчет ООП.. Если я вставлю весь код - это пара страниц только описания классов - многовато будет - тем более от этого понятней задача не станет. Тем более надо следовать принципу KISS. :)

-~{}~ 08.01.05 15:48:

Поэтому то, что я пишу это всего лишь малая часть - соглашусь это не ООП и не процедурный код. Это - процеДУРНЫЙ код для того, чтобы спросить как решить задачу такого плана..
 
Сверху