如何在PHP扩展中声明Closure函数?

时间:2016-01-18 08:07:15

标签: php c php-extension php-internals

我在C学习php扩展写。

现在我遇到下面的代码,我想声明一个Closure函数。

如何在PHP扩展中实现这一目标?

class myClass
{

    public function removeListener($event, $listener)
    {
        // some code
    }

    public function once($event, callable $listener)
    {
        // How to declare the closure and contain the use grammar features?

        $onceListener = function () use (&$onceListener, $event, $listener) {
            $this->removeListener($event, $onceListener);
            call_user_func_array($listener, func_get_args());
        };

        $this->on($event, $onceListener);
    } 


    public function on($event, $listener)
    {
        // some code
    }

}

@ NikiC 感谢您的评论。

我尝试使用下面的zend_create_closure API。

static void once_listener_handler(INTERNAL_FUNCTION_PARAMETERS)
{
    // How to get variables from syntax `use(&$onceListener, $event, $listener)` here.
    // And use these variables like `php_var_dump(zval);`.


    RETURN_TRUE;
}


zend_function mptr;
mptr.type = ZEND_USER_FUNCTION;
mptr.common.arg_info = NULL;
mptr.common.num_args = 0;
mptr.common.required_num_args = 0;
mptr.common.prototype = NULL;
mptr.common.scope = NULL;
mptr.internal_function.handler = once_listener_handler;

zend_create_closure (once_closure, &mptr, NULL, NULL TSRMLS_CC);

我在下面收到错误。

/mac/sourcecode/php-5.5.23/Zend/zend_hash.c(1055) : ht=0x9f8c69 is inconsistent
/mac/sourcecode/php-5.5.23/Zend/zend_hash.c(551) : ht=0x7ffff7e0e6c8 is inconsistent

Program received signal SIGSEGV, Segmentation fault.
0x00000000009f7740 in zend_mm_check_ptr (heap=0x1333ee0, ptr=0x7ffff7e12150, silent=1,
    __zend_filename=0xfa7b38 "/mac/sourcecode/php-5.5.23/Zend/zend_hash.c", __zend_lineno=568,
    __zend_orig_filename=0x0, __zend_orig_lineno=0) at /mac/sourcecode/php-5.5.23/Zend/zend_alloc.c:1384
1384        if (p->info._size != ZEND_MM_NEXT_BLOCK(p)->info._prev) {

您可以为zend_create_closure显示一些代码段吗?

尝试使用调用位置上下文传递的internal_function.handler回调中的一些变量。

谢谢你:)

0 个答案:

没有答案