PHP 7.4 INTERNALS UPGRADE NOTES 1. Internal API changes a. php_sys_symlink() and php_sys_link() b. zend_lookup_class_ex() and zend_fetch_class_by_name() c. Function/property/class flags d. Removed zend_check_private() e. php_win32_error_to_msg() memory management f. get_properties_for() handler / Z_OBJDEBUG_P 2. Build system changes a. Abstract b. Unix build system changes c. Windows build system changes 3. Module changes a. ext/xml b. ext/hash ======================== 1. Internal API changes ======================== a. php_sys_symlink() and php_sys_link() portability macros have been added, which behave like POSIX's symlink() and link(), respectively, on POSIX compliant systems and on Windows. b. zend_lookup_class_ex() and zend_fetch_class_by_name() prototypes were changed to accept optional lower-case class name as zend_string*, instead of zval*. c. Function/property/class flags changes - ZEND_ACC_CTOR and ZEND_ACC_DTOR are removed. It's possible to check if method is a constructor/destructor using the following condition (func->commpon.scope->constructor == func). - ZEND_ACC_IMPLEMENTED_ABSTRACT is removed (it was used only internally during inheritance). - ZEND_ACC_IMPLICIT_PUBLIC is removed (it was used only for reflection) - ZEND_ACC_SHADOW property flag is removed. Instead of creating shadow clone, now we use the same private property_info, and should also check property_info->ce (in the same way as with methods). - ZEND_ACC_ANON_BOUND is replaced with ZEND_ACC_LINKED. This flag is set not only during anonymous classes declaration, but also during any run-time or compile-time class declaration. - ZEND_ACC_NO_RT_ARENA renamed into ZEND_ACC_HEAP_RT_CACHE. Now it's used not only for closures, but also for pseudo-main op_arrays. - ZEND_ACC_... flags are re-numbered. d. zend_check_private() is removed. Use (func->common.scope == scope) instead. e. Pointers returned by php_win32_error_to_msg() have to be freed using php_win32_error_msg_free(). Same regarding php_win_err() vs. php_win_err_free(). f. A new, optional object handler with the signature HashTable *get_properties_for(zval *obj, zend_prop_purpose purpose) has been introduced, where zend_prop_purpose (currently) takes one of: ZEND_PROP_PURPOSE_DEBUG // var_dump etc. ZEND_PROP_PURPOSE_ARRAY_CAST // (array) $obj ZEND_PROP_PURPOSE_SERIALIZE // "O"-format serialization (__wakeup) ZEND_PROP_PURPOSE_VAR_EXPORT // var_export (__set_state) ZEND_PROP_PURPOSE_JSON // json_encode The handler returns a non-null HashTable with increased refcounted, and the return value must be released using zend_release_properties(). This handler serves the same general function as get_properties(), but provides more control over different property uses, while also making it possible to return a temporary property table. get_properties() is still used in cases where none of the above purposes apply, but overloading get_properties() is generally discouraged. If you want to provide purposes for general usage rather than just debugging or serialization, please prefer using properly declared properties. get_debug_info() is superseded by get_properties_for() with the ZEND_PROP_PURPOSE_DEBUG purpose, but remains available for backwards- compatibility reasons. However, while it is fine to define this handler, it should never be directly called by consuming code. The Z_OBJDEBUG_P macro has been removed. It should be replaced by calls to zend_get_properties_for() with the ZEND_PROP_PURPOSE_DEBUG purpose: // OLD int is_temp; HashTable *ht = Z_OBJDEBUG_P(obj, is_temp); // ... if (is_temp) { zend_hash_destroy(ht); FREE_HASHTABLE(ht); } // NEW HashTable *ht = zend_get_properties_for(obj, ZEND_PROP_PURPOSE_DEBUG); // ... zend_release_properties(ht); ======================== 2. Build system changes ======================== a. Abstract - The hash extension is now always available, meaning the --enable-hash configure argument has been removed. b. Unix build system changes - configure --help now also outputs --program-suffix and --program-prefix information by using the Autoconf AC_ARG_PROGRAM macro. - Obsolescent macros AC_FUNC_VPRINTF and AC_FUNC_UTIME_NULL have been removed. Symbols HAVE_VPRINTF and HAVE_UTIME_NULL are no longer defined since they are not needed on the current systems. c. Windows build system changes ======================== 3. Module changes ======================== a. ext/xml - The public (internal) API of the ext/xml extension has been removed. All functions and structures are private to the extension now. b. ext/hash - The hash extension is now always available, allowing extensions to rely on its functionality to be available without compile time checks.