PHP 8.5 INTERNALS UPGRADE NOTES

1. Internal API changes

2. Build system changes

3. Module changes

4. OpCode changes

5. SAPI changes

========================
1. Internal API changes
========================

- Core
  . PG(arg_separator).input and PG(arg_separator).output are now `zend_string*`
    instead of `char*`.
  . DL_LOAD now doesn't use RTLD_DEEPBIND deepbind anymore on platforms
    where dlmopen with LM_ID_NEWLM is available:
    this means shared library symbol isolation (if needed) must be enabled on
    the user side when requiring libphp.so, by using dlmopen with LM_ID_NEWLM
    instead of dlopen.
    RTLD_DEEPBIND is still enabled when the Apache SAPI is in use.

- Zend
  . Added zend_safe_assign_to_variable_noref() function to safely assign
    a value to a non-reference zval.
  . Added zval_ptr_safe_dtor() to safely destroy a zval when a destructor
    could interfere.
  . zend_get_callable_name() now returns the name of the underlying function
    for fake closures.
  . Added smart_string_append_printf() matching smart_str_append_printf() for
    char* instead of zend_string*-based smart strings.
  . Added php_build_provider() to retrieve the value of PHP_BUILD_PROVIDER at
    runtime.
  . Removed the cache_slot argument of zend_check_user_type_slow() because
    now it only relies on the CE cache.
  . Added ZEND_NONSTRING attribute macro for character arrays that do not
    represent strings. This allows to silence the GCC 15.x
    `-Wunterminated-string-initialization` warning.
  . Added the zend_update_exception_properties() function for instantiating
    Exception child classes. It updates the $message, $code, and $previous
    properties.
  . ZEND_IS_XDIGIT() macro was removed because it was unused and its name
    did not match its actual behavior.
  . zend_register_constant() now returns a pointer to the added constant
    on success and NULL on failure instead of SUCCESS/FAILURE.

========================
2. Build system changes
========================

- Abstract
  . Preprocessor macro SIZEOF_PTRDIFF_T has been removed.
  . Preprocessor macro SIZEOF_INTMAX_T has been removed.

- Windows build system changes
  . SAPI() and ADD_SOURCES() now suport the optional `duplicate_sources`
    parameter.  If truthy, no rules to build the object files are generated.
    This allows to build additional variants of SAPIs (e.g. a DLL and EXE)
    without duplicate build rules.  It is up to the SAPI maintainers to ensure
    that appropriate build rules are created.

- Unix build system changes
  . libdir is properly set when --libdir (ex: /usr/lib64) and --with-libdir (ex lib64)
    configure options are used to ${libdir}/php (ex: /usr/lib64/php)
  . PHP_ODBC_CFLAGS, PHP_ODBC_LFLAGS, PHP_ODBC_LIBS, PHP_ODBC_TYPE preprocessor
    macros defined by ext/odbc are now defined in php_config.h instead of the
    build-defs.h header.
  . Autoconf macro PHP_AP_EXTRACT_VERSION has been removed.
  . Autoconf macro PHP_BUILD_THREAD_SAFE has been removed (set enable_zts
    manually).
  . Autoconf macro PHP_DEF_HAVE has been removed (use AC_DEFINE).
  . Autoconf macro PHP_OUTPUT has been removed (use AC_CONFIG_FILES).
  . Autoconf macro PHP_TEST_BUILD has been removed (use AC_* macros).
  . Preprocessor macro HAVE_PTRDIFF_T has been removed.
  . Preprocessor macro HAVE_INTMAX_T has been removed.

========================
3. Module changes
========================

- ext/gd
  . The gdImageScale*() and gdImageRotate*() helpers are now internal in the
    bundled libgd, like they have been in external libgd as of gd-2.1.1.

- ext/json
  . php_json_encode_serializable_object() now assumes `EG(active)`,
    if not a bailout is caused. Therefore a minor BC break exists if the
    `PHP_JSON_PARTIAL_OUTPUT_ON_ERROR` option is in use.
    However, this situation is highly unlikely.

- ext/libxml
  . The refcount APIs now return an `unsigned int` instead of an `int`.
  . Removed php_libxml_xmlCheckUTF8(). Use xmlCheckUTF8() from libxml instead.

- ext/pdo
  . Added `php_pdo_stmt_valid_db_obj_handle()` to check if the database object
    is still valid. This is useful when a GC cycle is collected and the
    database object can be destroyed prior to destroying the statement.

- ext/standard
  . Added php_url_decode_ex() and php_raw_url_decode_ex() that unlike their
    non-ex counterparts do not work in-place.
  . The php_std_date() function has been removed. Use php_format_date() with
    the "D, d M Y H:i:s \\G\\M\\T" format instead.
  . Added php_url_encode_to_smart_str() to encode a URL to a smart_str buffer.

========================
4. OpCode changes
========================

========================
5. SAPI changes
========================
