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

时间:2011-07-31 18:12:22

标签: php c php-extension php-internals

我正在编写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)。
  3. 虽然我是C的新手,但我认为PHP代码库在很多方面都过度编译了!

    希望这有助于其他人!

0 个答案:

没有答案