9

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

PHP 方法如下所示:

<?php
class Model {
  static method GetModelById($id) { ... }
}
?>

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 ...
}

...其中所有传递的参数都应包含正确的值。这里奇怪的是:如果我针对 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!"); 
}

...所以我了解到:

  1. 函数名必须始终为小写
  2. 当涉及到字符串长度时,您最好查看 PHP 的源代码(在zend_call_method内部添加 +1)。

虽然我是 C 新手,但我认为 PHP 代码库在很多方面都过于复杂了!

希望这对其他人有帮助!

4

0 回答 0