最近在写一个PHP扩展.
发现两个版本之间内部迭代器接口函数有些许变化,区别如下:
<code>{php-src}/Zend/zend_interface.c (in 5.3.X): ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) ---------------------------------------------------------------------------------- {php-src}/Zend/zend_interface.c (in 5.4.X): ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key TSRMLS_DC) </code>
请问这个变更是和PHP版本关联:
<code>5.3 --- 5.4 </code>
还是跟扩展版本关联:
<code>PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 ---------------------------------- PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 </code>
如何适配不同版本的API呢?
最近在写一个PHP扩展.
发现两个版本之间内部迭代器接口函数有些许变化,区别如下:
<code>{php-src}/Zend/zend_interface.c (in 5.3.X): ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) ---------------------------------------------------------------------------------- {php-src}/Zend/zend_interface.c (in 5.4.X): ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key TSRMLS_DC) </code>
请问这个变更是和PHP版本关联:
<code>5.3 --- 5.4 </code>
还是跟扩展版本关联:
<code>PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 ---------------------------------- PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 </code>
如何适配不同版本的API呢?
至少从源码上看,和ZEND_MODULE_API_NO、ZEND_EXTENSION_API_NO 没有关系。
只能是PHP_API_VERSION了。
zend_interfaces.c
这个里面的这几个方法是定义的一些userspace iterator interfaces。
你是不是用的5.4开发分支的源代码?因为这个函数接口的改动是为了:Added support for non-scalar Iterator keys in foreach。
但这个特性是5.5才开始支持的,5.4中zend_user_it_get_current_key
这个函数的签名和以前没有变化啊。
我觉得遇到这种情况,一种办法是:
<code>#if PHP_API_VERSION < 20120000 #else #endif </code>
不过我没踩过,有坑不要怪我