Всех приветствую! Я недавно начал изучать замечательную библиотеку Qt. В этой библиотеке основополагающей технологией является технология "Сигналов и слотов", которая позволяет связывать объекты между собой, причем так, что они о друг друге ничего не знают. Сама идея просто уникальна и мне захотелось использовать её при программировании на PHP.
Хочется узнать ваши мнения об этой технологии и реализации её на PHP.
И за одним выкладываю код, который пока что удалось написать:
<?php
class CObject {
private static $connections;
private $class_id = 0; //уникальный идентификатор класса
//функция подключения классов
public static function connect($emm_class, $signal, $dest_class, $slot) {
static $id = 0; //генератор уникальных идентификаторов классов
if(! $emm_class->class_id) //если идентификатора нет,
$emm_class->class_id = ++$id; //формируем новый
self::$connections[$emm_class->class_id][$signal][] =
array($dest_class, $slot);
}
//отправка сообщений
public function emmit($signal, $params = NULL) {
$conn = @self::$connections[$this->class_id][$signal];
if($conn) {
foreach($conn as $c) {
eval("@\$c[0]->" . $c[1] ."(\$params);");
}
}
}
}
class CFoo1 extends CObject {
//функция - слот
public function slotOK() {
echo "CFoo1::msgOK()<br>";
}
}
class CFoo3 extends CObject {
//функция - слот
public function slotOK($param) {
print("CFoo3::dump_var:<br>");
print(var_dump(nl2br(var_dump($param))));
print("<br>");
echo "CFoo3::msgOK()<br>";
}
public function slotHelloWorld() {
echo "Hello, World!";
}
}
class CFoo2 extends CObject {
public function __construct() {
}
public function test() {
$obj->m_1 = 1;
$obj->m_2 = 'Hello, World!';
//отправка сообщений
$this->emmit('signOK',$obj);
}
}
$a = new CFoo1();
$c = new CFoo3();
$b = new CFoo2();
CObject::connect($b, 'signOK', $a, 'slotOK');
CObject::connect($b, 'signOK', $c, 'slotOK');
CObject::connect($b, 'signOK', $c, 'slotHelloWorld');
$b->test();
?>
Программа выводит в браузер следующее:
CFoo1::msgOK()
CFoo3::dump_var:
object(stdClass)#4 (2) { ["m_1"]=> int(1) ["m_2"]=> string(13) "Hello, World!" } string(0) ""
CFoo3::msgOK()
Hello, World!