如何实例php内部的php扩展
问题描述:
如何实例php内部的php扩展!如何实例php内部的php扩展
这里是我的代码:
zval *obj;
MAKE_STD_ZVAL(obj);
zend_class_entry *foo_ce;
if(zend_hash_find(EG(class_table), "foo", sizeof("foo"), (void **)&foo_ce) == SUCCESS){
printf("get foo success\n");
object_init_ex(obj, foo_ce);
} else {
printf("get class failed\n");
}
printf("here\n");
但我得到Segmentation fault
当它进入object_init_ex
片段!这样的下面
GDB信息:
\#0 0x0000000000925038 in zend_hash_apply_deleter (ht=0xfac750, p=0x120b980) at /root/php-5.5.38/Zend/zend_hash.c:619
\#1 0x00000000009257b2 in zend_hash_reverse_apply (ht=0xfac750, apply_func=0x8fe67f <clean_non_persistent_class>) at /root/php-5.5.38/Zend/zend_hash.c:804
\#2 0x00000000008fec25 in shutdown_executor() at /root/php-5.5.38/Zend/zend_execute_API.c:300
\#3 0x000000000091297d in zend_deactivate() at /root/php-5.5.38/Zend/zend.c:946
\#4 0x000000000088c26f in php_request_shutdown (dummy=0x0) at /root/php-5.5.38/main/main.c:1813
\#5 0x00000000009bc433 in do_cli (argc=2, argv=0xfabb10) at /root/php-5.5.38/sapi/cli/php_cli.c:1177
\#6 0x00000000009bcabb in main (argc=2, argv=0xfabb10) at /root/php-5.5.38/sapi/cli/php_cli.c:1378
答
我发现使用zend_lookup_class
找到一个PHP类和实例它的另一种方式;
zend_class_entry **class_ce, *old_scope;
zval *retval_ptr;
zend_lookup_class(name, strlen(name), &class_ce TSRMLS_CC);
object_init_ex(return_value, *class_ce);
然后return_value是一个对象吧!
你是否检查'obj'是否指向有效内存? – WhiteSword
请提供更多的上下文,这里没有任何错误显而易见 – Ctx
我发布我的所有代码github.com/longmon/php-ioc.git, –