小编Pet*_*ulz的帖子

PHP Zend引擎扩展静态方法调用

我正在写一个PHP扩展.从C代码我尝试在PHP代码中调用静态方法.

PHP方法如下所示:

<?php
class Model {
  static method GetModelById($id) { ... }
}
?>
Run Code Online (Sandbox Code Playgroud)

C中的调用如下所示:

if( call_user_function_ex(
      &((*ce)->function_table),
      NULL, &fname, &retval_ptr,
      1, func_params, 0, NULL TSRMLS_CC
    ) == SUCCESS
){
  // do some stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

...所有传递的参数都应包含适当的值.这里奇怪的是:如果我编译我的扩展对PHP 5.2代码工作正常,如果我编译这对PHP 5.3,方法调用失败,没有错误消息.

我也尝试过zend_call_method两种版本都没有成功.

任何人都可以给我一个提示吗?你会如何从C调用静态方法?

提前致谢!

编辑

对不起,伙计们,我zend_call_method这样做了:

if( zend_call_method( NULL, *ce, NULL, 
                     "getmodelbyid", 
                     strlen("getmodelbyid"), 
                     &retval_ptr, 1, p1, 
                     NULL TSRMLS_CC ) == FAILURE) {
    php_printf("gosh!");
} 
else {
    php_printf("yep!"); 
}
Run Code Online (Sandbox Code Playgroud)

......所以我学到了:

  1. 函数名称必须始终为小写
  2. 在字符串长度方面,你最好看一下PHP的源代码(zend_call_method内部加+1).

虽然我是C的新手,但我认为PHP代码库在很多方面都过度编译了!

希望这有助于其他人!

php c php-extension php-internals

9
推荐指数
0
解决办法
1145
查看次数

标签 统计

c ×1

php ×1

php-extension ×1

php-internals ×1