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

发布于 2024-11-27 02:58:03 字数 1196 浏览 1 评论 0原文

我正在编写一个 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 代码库在很多方面都过于复杂!

希望这对其他人有帮助!

I am writing a PHP extension. From the C code I try to invoke a static method in PHP code.

The PHP-method looks like this:

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

The call in C looks like this:

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

... where all passed parameters should contain proper values. The strange thing here is: if I compile my extension against php 5.2 the code works fine, if I compile this against php 5.3, the method call fails with no error message.

I also tried zend_call_method with no success in either version.

Can anyone give a tip for me? How would you call a static method from C?

Thanks in advance!

Edit

Sorry guys, I got it working via zend_call_method like so:

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!"); 
}

... so I learned:

  1. Function names must always be in lowercase
  2. You better have a look at PHP's source code when it comes to string lengths (zend_call_method adds +1 internally).

Although I am new to C, I think the PHP code base is over-compilcated in many ways!

Hope this helps someone else!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文