Pull to refresh

Учим PHP общатся

Reading time3 min
Views635

Об общении.


Все люди независимы (ну или почти)! Все люди общаются!
Всем известен обряд общения между людьми, его причины. Для получения нужной нам информации о ней можно спросить, и не обязательно конкретного человека. Спросить, так сказать, в воздух, если кто-то знает ответ — он ответит.

Об JavaScript’е и Qt.


Я люблю яваскрипт. Мне нравится его гибкость. Мне нравятся его событийная система.
Хоть я и не считаю себя С++ программистом, мне нравится Qt. Его (ее?) система сигналов/слотов.

Почему я вспомнил об языке и библиотеке? Потому что они умеют общатся, это выделяет их.

Об идее.


Все модули независимы (ну или почти)! Все модули общаются!
Как-то я подумал:, а почему бы научить общатся еще один мой любимый язык? PHP.
Представил себе систему, где все ее компоненты независимы друг от друга, более того — они не знают друг о друге.
Они общаются.
 — Есть у кого значение переменной ххх?
 — Да, конечно, держи.
 — Может кто-то дать мне последние 10 коментариев?
 — Без проблем.


Об реализации.


Поискав немного информацию по этому вопросу, нашел попытку реализации Qt в PHP — QPHP, но это не то, чего я хотел. Есть еще реализация сигналов/слотов в фреймворке ezComponents, но это тоже не то. Потому я приступил к проектированию ядра будущей библиотеки.
В моем воображении она выглядела так:
image
Как видно на схемке, все компоненты системы зависят только от ядра, так как все сообщения / события идут через него.
Что я решил включить в ядро:
  • самое главное — класc-синглтон реализирующий само общение, он имитирует основные методы Qt (connect, disconnet, emit, isConnected), и реализирует систему исключений (сообщения на которые не надо ядру отвечать)
  • сигналы и слоты было решено обернуть в класы, для контроля типов, да и вообще инкапсуляции некоторой логики
  • конфигуратор — клас который загружает конфиг, я решил его включить в ядро… Это спорный вопрос, но это показалось мне правильным (конечно же с модулями он будет общатся исключительно сообщениями)
  • суперклас для класов которые будут пользоватся сообщениями (он делает прозрачным запрос менеджера сообщений)
    суперклас для модулей — он умеет загружать информацию о модуле, проверять зависимости, и т.п.
По моему этого вполне достаточно.

Код реализации ждите в скором времени.

Об использовании


Типичным использованием я вижу примерно следующее:
  1. <?php
  2.  
  3. class module_test_1 extends module
  4. {
  5.     public function __construct()
  6.     {
  7.         // согласен что выглядет немного мострообразно, но это для понимания, да и хуков никто не отменял
  8.         $this->emit(new signal('config.getvar', array('var' => 'varname', 'callback' => array($this, 'write')));
  9.         $this->emit(new signal('module_test_1.run'));
  10.     }
  11.    
  12.     public function write($val)
  13.     {
  14.         echo "varname = $val";
  15.     }
  16. }
  17.  
  18. class module_test_2 extends module
  19. {
  20.     public function __construct()
  21.     {
  22.         $this->connect(new slot('module_test_1.run', array($this, 'write')));
  23.     }
  24.    
  25.     public function write()
  26.     {
  27.         echo "module_test_1 -> run";
  28.     }
  29. }
  30.  
  31. $test_2 = new module_test_2();
  32. $test_1 = new module_test_1();


______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru
Tags:
Hubs:
Total votes 25: ↑12 and ↓13-1
Comments33

Articles