Не удается сохранить замыкания в потоке

Я пытаюсь использовать замыкание в качестве обратного вызова после завершения потока. Однако я сталкиваюсь с тем, что кажется предельным / сбойным PHP или расширением pthread.

Мой стек разработчика работает на Win7 x64 с PHP 5.5.3 x86 TS, pthread версии 0.44.

Следующий код работает:

class Test
{
    public $callbackVar;
}

$test = new Test();

$callbackVar = function()
{
    echo "Callback var invoked.";
};

$test->callbackVar = $callbackVar;
$test->callbackVar->__invoke();

Но как только я получаю Test из Thread, запуск скрипта выдаст ошибку:

class Test extends Thread
{
    public $callbackVar;
    public function run() { }
}

$test = new Test();

$callbackVar = function()
{
    echo "Callback var invoked.";
};

$test->callbackVar = $callbackVar;
// assert() returns true
assert($test->callbackVar === null);
$test->callbackVar->__invoke();   

Со следующим выводом

Fatal error: Call to a member function __invoke() on a non-object

У кого-нибудь когда-нибудь была эта проблема? Любой возможный обходной путь? Я бы предпочел не использовать eval, если это возможно... Я пробовал много обходных путей, таких как перераспределение в другое замыкание, используя функцию ReflectionFunction,... ничего не режет.

1 ответ

Решение

Zend не позволяет вам сериализовать объекты замыкания.

Так что это не то, что вы должны пытаться обойти, возможно, когда-нибудь в будущем Zend разрешит сериализацию Closures, тогда pthread не потребует изменений.

Вам просто нужно сделать это по старинке...

Другие вопросы по тегам