2015-06-23 3 views
1

У меня есть класс, который похож на этот полосатый вниз версия:Обратный вызов передается в переменных класса пустуют на var_dump

abstract class MainClass extends Thread{ 
    protected $events = []; 

    public function on($message, callable $callback){ 
     $this->events[$message] = $callback; 
    } 
} 

class MyClass extends MainClass{ 
    // has some random methods 
} 

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

$myClass = new MyClass(); 
call_user_func_array("myCallback", array($myClass)); 
var_dump($myClass); 

function myCallback($class){ 
    $class->on("message", function(){ 
     // Do some stuff 
    }); 
} 

Когда я делаю var_dump на классе, MyClass::$var массив пуст. Почему это?

Редактировать

Если я не продлевают Thread класс, это работает. Почему класс Thread не позволяет мне изменять мои свойства?

+0

Вы получаете какую-либо ошибку? – taxicala

+0

@taxicala nope, no error –

+0

После запуска моего примера он работает, но в реальном коде это не так. Я должен посмотреть, почему ... –

ответ

2

Мне удалось заставить это работать, используя объект Stackable. Я выяснил, что массивы не являются потокобезопасными, поэтому для выполнения этой задачи я сделал следующее:

class Events extends Stackable{ 

    public function add($message, callable $callback){ 
     $this[$message] = $callback; 
    } 

} 

abstract class MainClass extends Thread{ 

    protected $events; 

    public function __construct(Events $events){ 
     $this->events = $events; 
    } 

    public function on($message, callable $callback){ 
     $this->events->add($message, $callback); 
    } 

} 

class MyClass extends MainClass{ 
    // has some random methods 
} 

$evts = new Events(); 
$myClass = new MyClass($evts); 
call_user_func_array("myCallback", array($myClass)); 
var_dump($myClass); 

function myCallback($class){ 
    $class->on("My Message", function(){ 
     // Do some stuff 
    }); 
} 
+1

Это правильный ответ. –

Смежные вопросы