Показать сообщение отдельно
Старый 27.09.2013, 00:59   #1
Черный крыс
 
Сообщений: n/a
Странное поведение массива...

Реализовал класс хуков через типы - все работало отлично. Потом решил переделать с использованием массивов - четко видно, что нигде логического тупняка я не допустил, методы класса логгируют, что добавлены 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;

?>
 
Ответить с цитированием