When the PHP7 extension was written, some of the kernel methods provided were not completely compatible with previous PHP versions. compatible. Many method parameters have been adjusted. Below are some issues encountered during the migration process. Record it to prevent others from stepping into the trap again.
add_assoc_stringl
The method parameters are changed to four.
add_assoc_stringl(parray, key, value, value_len);
When migrating, just delete the last parameter.
add_assoc_string
The method parameters have been changed from four to three.
add_assoc_stringl(parray, key, value);
When migrating, just delete the last parameter.
add_next_index_stringl
The method parameters have been changed from four to three.
add_next_index_stringl(parray, value, value_len);
When migrating, just delete the last parameter.
add_next_index_string
The method parameters have been changed from three to two.
add_next_index_string(parray, value);
When migrating, just delete the last parameter.
RETURN_STRINGL
The method parameters have been changed from three to two.
RETURN_STRINGL(value, length);
When migrating, just delete the last parameter.
Error: 'INT64_MAX' has not been declared in this scope
The reason is in-depth research. Add a line
above #include "php.h"#include <stdint.h> #ifndef INT64_MAX # define INT64_MAX INT64_C( 9223372036854775807) #endif #ifndef INT64_MIN # define INT64_MIN (-INT64_C( 9223372036854775807)-1) #endif
Solved.
Create class
You can refer to the mysqli_objects_new method in the mysqli extension mysqli.c file.
Variable declarations are allocated from the heap to the stack.
For example, the original code is
zval* sarray_l; ALLOC_INIT_ZVAL(sarray_l); array_init(sarray_l);
changed to
zval sarray_l; array_init(&sarray_l); zend_hash_get_current_key_ex
Method parameters changed from six to four.
ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, HashPosition *pos);
When migrating, just delete the third and fifth parameters.
Error: 'Z_TYPE_PP' has not been declared in this scope
There is no Z_TYPE_PP macro, only the definition of Z_TYPE and Z_TYPE_P macro methods.
h2 error: cannot convert from 'zend_string*' to 'const char*'
The processing of strings in PHP7 uses zend_string for storage. If you want to convert zend_string to const char. Need to use ZSTR_VAL() macro method. The code is as follows:
zend_string *str; char *sptr; ..... sptr = ZSTR_VAL(str);
Error: 'IS_BOOL' has not been declared in this scope
There is no IS_BOOL type. Instead, it is divided into IS_TRUE and IS_FALSE.
Error: 'Z_BVAL' has not been declared in this scope
There is no Z_BVAL macro anymore. But it can be determined by whether the type is IS_TRUE and IS_FALSE.
If the type is IS_TRUE, the value is true. If the type is IS_FALSE the value is false.
Error: 'zend_object_store_get_object' has not been declared in this scope
Add the following code:
static inline hsf_object *hsf_fetch_object(zend_object *obj) /* {{{ */ { return (user_object *)((char*)(obj) - XtOffsetOf(user_object, std)); } /* }}} */ #define Z_USEROBJ_P(zv) hsf_fetch_object(Z_OBJ_P((zv)))
Then change zend_object_store_get_object to Z_USEROBJ_P.
Note that user_object is the structure you defined.
The above is a description of the compatibility issues recorded for PHP extension migration to PHP7 extension. I hope it will be helpful to everyone.