我在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
回调中的一些变量。
谢谢你:)