PHP Zend 引擎扩展静态方法调用
我正在编写一个 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!");
}
...所以我了解到:
- 函数名称必须始终为小写
- 你最好看看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:
- Function names must always be in lowercase
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论