1PHP 8.3 INTERNALS UPGRADE NOTES 2 31. Internal API changes 4 52. Build system changes 6 73. Module changes 8 94. OpCode changes 10 115. SAPI changes 12 13======================== 141. Internal API changes 15======================== 16 17* zend_class_entry now possesses a default_object_handlers field, which 18 provides a default object handler when create_object() is not overriding it. 19* Custom Fiber implementations have to initialize EG(stack_limit) and 20 EG(stack_base). 21* EG(opline_before_exception) may now be null if the VM throws an exception 22 before executing any opline. 23* Many C header files have been cleaned up and include dependencies 24 have been reduced. Many headers which used to be always included by 25 Zend headers (e.g. "errno.h") are no longer implied, and this may 26 break the build of third-party extensions which relied on this 27 implementation detail. Those extensions may need to add the missing 28 #include lines. 29* Since version 8, PHP requires a C99 compiler. Configure-time checks 30 for C99 features have been removed and therefore macro definitions 31 from php_config.h have disappeared. Do not use those feature 32 macros. 33* Internal class aliases created during request time can now exist in 34 the class table. zend_register_class_alias_ex() will not increase 35 the refcount for class aliases and the cleanup function takes this 36 into account. 37* The return types of the following functions have been changed from 38 `bool` to `zend_result`: 39 - zend_fiber_init_context() 40* The fast_add_function() has been removed, use add_function() that will 41 call the static inline add_function_fast() instead. 42* The order of members of zend_op_array, zend_ssa_var, zend_ssa_var_info, 43 zend_executor_globals and php_core_globals have changed to improve 44 struct packing which reduces their size. 45* Many calls to zend_assign_to_variable have been replaced with 46 zend_assign_to_variable_ex which allows delaying the releasing of the old 47 variable value. This avoids side-effects through destructors between the 48 assignment of the variable and the assignment to the result zval in the VM 49 (i.e. it may free the new value). See GH-10168 for details. 50* The return types of the following functions were changed from int to 51 zend_result: 52 - open_file_for_scanning 53 - php_rfc1867_callback 54 - virtual_chdir 55 - zend_execute_scripts 56 - zend_get_module_started 57 - zend_handle_undef_args 58 - zend_list_delete 59 - zend_multibyte_parse_encoding_list 60 - zend_multibyte_set_internal_encoding 61 - zend_parse_ini_file 62 - zend_parse_ini_string 63 - zend_set_user_opcode_handler 64 - zend_ssa_inference 65* Removed unused macros PHP_FNV1_32A_INIT and PHP_FNV1A_64_INIT. See GH-11114. 66* ext/standard/hrtime.h was moved to Zend/zend_hrtime.h 67 * The prefix of the PHP_HRTIME_ macros was changed to ZEND_HRTIME_ 68 * The HRTIME_AVAILABLE macro was renamed to ZEND_HRTIME_AVAILABLE 69 * The php_hrtime_current() function was renamed to zend_hrtime() 70* _php_stream_dirent now has an extra d_type field that is used to store the 71 directory entry type. This can be used to avoid additional stat calls for 72 types when the type is already known. 73* The misspelled ZEND_CGG_DIAGNOSTIC_IGNORED_(START|END) macros are deprecated. 74 Use ZEND_DIAGNOSTIC_IGNORED_(START|END) instead. These macros now also support 75 Clang. 76 77======================== 782. Build system changes 79======================== 80 81* PHP_EXTRA_VERSION can be passed to configure script to control custom PHP 82 build versions: ./configure PHP_EXTRA_VERSION="-acme" 83 84* LDFLAGS are not unset anymore allowing them to be adjusted e.g. 85 LDFLAGS="..." ./configure 86 87* Removed the HAVE_DEV_URANDOM compile time check. HAVE_DEV_URANDOM will 88 now never be defined. Any checks relying on HAVE_DEV_URANDOM should be 89 removed. Even with HAVE_DEV_URANDOM it was not guaranteed that 90 /dev/urandom is actually available at run time and thus a runtime 91 check needs to happen in all cases. 92 93======================== 943. Module changes 95======================== 96 97 a. ext/json 98 - A new function php_json_validate_ex has been added to check if the 99 provided C string is valid for the given depth and options. 100 101 b. ext/standard 102 - The PHPAPI php_url_encode_hash_ex() function has had its signature change 103 from: 104 PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, 105 const char *num_prefix, size_t num_prefix_len, 106 const char *key_prefix, size_t key_prefix_len, 107 const char *key_suffix, size_t key_suffix_len, 108 zval *type, const char *arg_sep, int enc_type); 109 to: 110 PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, 111 const char *num_prefix, size_t num_prefix_len, 112 const zend_string *key_prefix, 113 zval *type, const zend_string *arg_sep, int enc_type); 114 The change to use zend_string prevent the computation of the arg_sep 115 length at each call. The key_suffix parameter was dropped as it was a 116 constant value and depended on the key_prefix parameter to not be NULL. 117 118 c. ext/mysqlnd 119 - The function mysqlnd_shutdown and its corresponding internal methods 120 mysqlnd_command::shutdown & mysqlnd_conn_data::shutdown have been removed. 121 These functions are deprecated by MySQL in favour of SHUTDOWN SQL statement. 122 123 d. ext/pcre 124 - The function pcre_get_compiled_regex_ex has been removed. 125 Use pcre_get_compiled_regex instead. 126 127 e. ext/spl 128 - The PHPAPI spl_iterator_apply() function now returns zend_result instead of int. 129 There are no functional changes. 130 - The field _spl_filesystem_object->is_recursive has been removed. 131 132 f. ext/dom 133 - A new function dom_get_doc_props_read_only() is added to gather the document 134 properties in a read-only way. This function avoids allocation when there are 135 no document properties changed yet. 136 - The node list returned by DOMNode::getElementsByTagName() and 137 DOMNode::getElementsByTagNameNS() now caches the length and the last requested item. 138 This means that the length and the last requested item are not recalculated 139 when the node list is iterated over multiple times. 140 If you do not use the internal PHP dom APIs to modify the document, you need to 141 manually invalidate the cache using php_libxml_invalidate_node_list_cache_from_doc(). 142 Furthermore, the following internal APIs were added to handle the cache: 143 . php_dom_is_cache_tag_stale_from_doc_ptr() 144 . php_dom_is_cache_tag_stale_from_node() 145 . php_dom_mark_cache_tag_up_to_date_from_node() 146 - The function dom_get_elements_by_tag_name_ns_raw() has an additional parameter to indicate 147 the base node of the node list. This function also no longer accepts -1 as the index argument. 148 - The function dom_namednode_iter() has additional arguments to avoid recomputing the length of 149 the strings. 150 - The functions dom_parent_node_prepend(), dom_parent_node_append(), dom_parent_node_after(), and 151 dom_parent_node_before() now use an uint32_t argument for the number of nodes instead of int. 152 - There is now a helper function php_dom_get_content_into_zval() to get the contents of a node. 153 This avoids allocation if possible. 154 - The function dom_set_old_ns() has been moved into ext/libxml as php_libxml_set_old_ns() and 155 is now publicly exposed as an API. 156 157 g. ext/libxml 158 - Two new functions: php_libxml_invalidate_node_list_cache_from_doc() and 159 php_libxml_invalidate_node_list_cache() were added to invalidate the cache of a node list. 160 161======================== 1624. OpCode changes 163======================== 164 165======================== 1665. SAPI changes 167======================== 168 169* SAPIs that may execute in alternative stacks have to set EG(stack_limit) and 170 EG(stack_base) 171