Реализовал класс хуков через типы - все работало отлично. Потом решил переделать с использованием массивов - четко видно, что нигде логического тупняка я не допустил, методы класса логгируют, что добавлены 2 функции... но почему-то при запуске хука вызывается только одна функция... не могу понять в чем тут фейл...,,,???
Исходный код с примером ->
На страницу должно вывести такую запись "Albert Hello! How are you?" но вторая функция не срабатывает и выводит только "Albert Hello!"
<?php
class Hook {
protected $_data = null;
public function add($func, $context=null, $priority=0) {
if (is_callable($func) == false) { return false; }
$t = [$func, $context, $priority, null];
$pred = null;
$hook = $this->_data;
while ($hook != null) {
if ($priority > $hook[2]) { break; }
$pred = $hook;
$hook = $hook[3];
}
if ($pred != null) {
$t[3] = $pred[3];
$pred[3] = $t;
echo("add :".$func);
} else {
$t[3] = $this->_data;
$this->_data = $t;
echo("added ".$func);
}
return true;
}
public function run($data=null) {
$hook = $this->_data;
while ($hook != null) {
echo($hook[0]);
$data = call_user_func($hook[0], $data, $hook[1]);
$hook = $hook[3];
}
return $data;
}
public function rem($func, $context=null) {
$pred = null;
$hook = $this->_data;
while (($hook != null) and (($hook[0] != $func) or ($hook[1] != $context))) {
$pred = $hook;
$hook = $hook[3];
}
if ($hook == null) { return false; }
if ($pred != null) {
$pred[3] = $hook[3];
} else {
$this->_data = $hook[3];
}
return true;
}
};
/* ***EXAMPLE*** */
function test1($data, $context) {
return $data.' Hello!';
}
function test2($data, $context) {
return $data.' How are you?';
}
$hook = new Hook;
$hook->add('test1');
$hook->add('test2');
echo($hook->run('Albert'));
$hook = null;
?>