Skip to content

PHP 8.5 documentation tracker #4886

Open

Description

@DanielEScherzer

Pages which need to be added/modified for complete documentation of PHP 8.5:

Note

This issue is still a Work In Progress

Important

Priority should be given to documenting Core language and ext/standard behavioral changes

Migration Guide

Core

Backward Incompatible Changes✅

Details

Deprecations

INI changes ✅

Details

New classes ✅

Details

New functions ✅

Details

New global constants ✅

Details

New features

Other changes ✅

Details

New warnings and exceptions

BZ2 ✅

Details

FileInfo: ✅

Details

Intl

LDAP: ✅

Details

MySQLi: ✅

Details

PCNTL: ✅

Details

PDO ✅

Details

PDO_FIREBIRD ✅

Details

PDO_SQLITE: ✅

Details

POSIX ✅

Details

Session ✅

Details

SimpleXML ✅

Details

SNMP✅

Details
  • snmpget, snmpset, snmp_get2, snmp_set2, snmp_get3, snmp_set3 and SNMP::__construct() throw a ValueError when the hostname is too large, contains any null byte or if the port is given when negative or greater than 65535, timeout and retries values are lower than -1 or too large. SNMP: add changelog for PHP 8.5 ValueError validation #5533

Sockets ✅

Details

Tidy ✅

Details

New extensions

Lexbor✅

Details
  • An always enabled lexbor extension is added. It contains the lexbor library that was separated from ext/dom for being reused among other extensions. The new extension is not directly exposed to userland. PHP 8.5 migration guide  #4906

URI ✅

Details

SAPI changes

CLI ✅

Details

CLI/CGI ✅

Details

FPM✅

Details

Extension changes

Curl✅

Details

Date

DOM

Enchant ✅

Details

Exif

FileInfo✅

Details

Filter ✅

Details

GD: ✅

Details

Hash✅

Details

Intl

LDAP✅

Details

libxml✅

Details

MBstring✅

Details

MySQLi ✅

Details

ODBC✅

Details
  • BC breaks
    • ODBC now assumes that at least ODBC 3.5 functionality is available. The ODBCVER definition and build system flags to control it have been removed. (PHP 8.5 migration guide  #4906)
    • ODBC no longer has build flags to build against specific drivers (except for DB2) and removes special cases for those drivers. It is strongly recommended to use a driver manager like iODBC or unixODBC on non-Windows. (PHP 8.5 cleanup for ODBC documentation #4870)

Opcache

  • BC breaks
    • The Opcache extension is now always built into the PHP binary and is always loaded. The INI directives opcache.enable and opcache.enable_cli are still honored. The --enable-opcache/--disable-opcache configure flags have been removed, and the build does not produce opcache.so or php_opcache.dll objects anymore. Using zend_extension=opcache.so or zend_extension=php_opcache.dll INI directives will emit a warning. (opcache: document always-built-in and file_cache_read_only (8.5) #5881)
  • INI changes
    • Added opcache.file_cache_read_only to support a read-only opcache.file_cache directory, for use with read-only file systems (e.g. read-only Docker containers). Best used with opcache.validate_timestamps=0, opcache.enable_file_override=1, and opcache.file_cache_consistency_checks=0. Note: A cache generated with a different build of PHP, a different file path, or different settings (including which extensions are loaded), may be ignored. (opcache: document always-built-in and file_cache_read_only (8.5) #5881)
    • The default value of opcache.jit_hot_loop is now 61 (a prime) to prevent it from being a multiple of loop iteration counts. It is recommended that this parameter is set to a prime number. Update opcache.jit_hot_loop #4685
    • Changing opcache.memory_consumption when OPcache SHM is already set up will now correctly report a failure instead of silently doing nothing and showing misleading values in PHPInfo.
  • New functions
  • Other changes
    • The Opcache extension is now always built into the PHP binary and is always loaded. The INI directives opcache.enable and opcache.enable_cli are still honored.

OpenSSL

PCNTL✅

Details
  • Other changes
    • pcntl_exec() now has a formal return type of false.
    • pcntl_waitid() takes an additional resource_usage argument to gather various platform specific metrics about the child process.

PCRE✅

Details

PDO

List of affected constants that still need documentation of the deprecation as of 2026.09.22
  • PDO::DBLIB_ATTR_CONNECTION_TIMEOUT => Pdo\Dblib::ATTR_CONNECTION_TIMEOUT
  • PDO::DBLIB_ATTR_QUERY_TIMEOUT => Pdo\Dblib::ATTR_QUERY_TIMEOUT
  • PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
  • PDO::DBLIB_ATTR_VERSION => Pdo\Dblib::ATTR_VERSION
  • PDO::DBLIB_ATTR_TDS_VERSION => Pdo\Dblib::ATTR_TDS_VERSION
  • PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS => Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS
  • PDO::DBLIB_ATTR_DATETIME_CONVERT => Pdo\Dblib::ATTR_DATETIME_CONVERT
  • PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES => Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES
  • PDO::SQLITE_ATTR_OPEN_FLAGS => Pdo\Sqlite::OPEN_FLAGS
  • PDO::SQLITE_ATTR_READONLY_STATEMENT => Pdo\Sqlite::ATTR_READONLY_STATEMENT
  • PDO::SQLITE_OPEN_READONLY => Pdo\Sqlite::OPEN_READONLY
  • PDO::SQLITE_OPEN_READWRITE => Pdo\Sqlite::OPEN_READWRITE
  • PDO::SQLITE_OPEN_CREATE => Pdo\Sqlite::OPEN_CREATE
List of affected constants and their replacement:
  • PDO::DBLIB_ATTR_CONNECTION_TIMEOUT => Pdo\Dblib::ATTR_CONNECTION_TIMEOUT
  • PDO::DBLIB_ATTR_QUERY_TIMEOUT => Pdo\Dblib::ATTR_QUERY_TIMEOUT
  • PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
  • PDO::DBLIB_ATTR_VERSION => Pdo\Dblib::ATTR_VERSION
  • PDO::DBLIB_ATTR_TDS_VERSION => Pdo\Dblib::ATTR_TDS_VERSION
  • PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS => Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS
  • PDO::DBLIB_ATTR_DATETIME_CONVERT => Pdo\Dblib::ATTR_DATETIME_CONVERT
  • PDO::FB_ATTR_DATE_FORMAT => Pdo\Firebird::ATTR_DATE_FORMAT
  • PDO::FB_ATTR_TIME_FORMAT => Pdo\Firebird::ATTR_TIME_FORMAT
  • PDO::FB_ATTR_TIMESTAMP_FORMAT => Pdo\Firebird::ATTR_TIMESTAMP_FORMAT
  • PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => Pdo\Mysql::ATTR_USE_BUFFERED_QUERY
  • PDO::MYSQL_ATTR_LOCAL_INFILE => Pdo\Mysql::ATTR_LOCAL_INFILE
  • PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY => Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY
  • PDO::MYSQL_ATTR_INIT_COMMAND => Pdo\Mysql::ATTR_INIT_COMMAND
  • PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => Pdo\Mysql::ATTR_MAX_BUFFER_SIZE
  • PDO::MYSQL_ATTR_READ_DEFAULT_FILE => Pdo\Mysql::ATTR_READ_DEFAULT_FILE
  • PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => Pdo\Mysql::ATTR_READ_DEFAULT_GROUP
  • PDO::MYSQL_ATTR_COMPRESS => Pdo\Mysql::ATTR_COMPRESS
  • PDO::MYSQL_ATTR_DIRECT_QUERY => Pdo\Mysql::ATTR_DIRECT_QUERY
  • PDO::MYSQL_ATTR_FOUND_ROWS => Pdo\Mysql::ATTR_FOUND_ROWS
  • PDO::MYSQL_ATTR_IGNORE_SPACE => Pdo\Mysql::ATTR_IGNORE_SPACE
  • PDO::MYSQL_ATTR_SSL_KEY => Pdo\Mysql::ATTR_SSL_KEY
  • PDO::MYSQL_ATTR_SSL_CERT => Pdo\Mysql::ATTR_SSL_CERT
  • PDO::MYSQL_ATTR_SSL_CA => Pdo\Mysql::ATTR_SSL_CA
  • PDO::MYSQL_ATTR_SSL_CAPATH => Pdo\Mysql::ATTR_SSL_CAPATH
  • PDO::MYSQL_ATTR_SSL_CIPHER => Pdo\Mysql::ATTR_SSL_CIPHER
  • PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT
  • PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY => Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY
  • PDO::MYSQL_ATTR_MULTI_STATEMENTS => Pdo\Mysql::ATTR_MULTI_STATEMENTS
  • PDO::ODBC_ATTR_USE_CURSOR_LIBRARY => Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY
  • PDO::ODBC_ATTR_ASSUME_UTF8 => Pdo\Odbc::ATTR_ASSUME_UTF8
  • PDO::ODBC_SQL_USE_IF_NEEDED => Pdo\Odbc::SQL_USE_IF_NEEDED
  • PDO::ODBC_SQL_USE_DRIVER => Pdo\Odbc::SQL_USE_DRIVER
  • PDO::ODBC_SQL_USE_ODBC => Pdo\Odbc::SQL_USE_ODBC
  • PDO::PGSQL_ATTR_DISABLE_PREPARES => Pdo\Pgsql::ATTR_DISABLE_PREPARES
  • PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES => Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES
  • PDO::SQLITE_ATTR_OPEN_FLAGS => Pdo\Sqlite::OPEN_FLAGS
  • PDO::SQLITE_ATTR_READONLY_STATEMENT => Pdo\Sqlite::ATTR_READONLY_STATEMENT
  • PDO::SQLITE_DETERMINISTIC => Pdo\Sqlite::DETERMINISTIC
  • PDO::SQLITE_OPEN_READONLY => Pdo\Sqlite::OPEN_READONLY
  • PDO::SQLITE_OPEN_READWRITE => Pdo\Sqlite::OPEN_READWRITE
  • PDO::SQLITE_OPEN_CREATE => Pdo\Sqlite::OPEN_CREATE
List of affected methods and their replacement:
  • PDO::pgsqlCopyFromArray() => Pdo\Pgsql::copyFromArray()
  • PDO::pgsqlCopyFromFile() => Pdo\Pgsql::copyFromFile()
  • PDO::pgsqlCopyToArray() => Pdo\Pgsql::copyToArray()
  • PDO::pgsqlCopyToFile() => Pdo\Pgsql::copyToFile()
  • PDO::pgsqlGetNotify() => Pdo\Pgsql::getNotify()
  • PDO::pgsqlGetPid() => Pdo\Pgsql::getPid()
  • PDO::pgsqlLOBCreate() => Pdo\Pgsql::lobCreate()
  • PDO::pgsqlLOBOpen() => Pdo\Pgsql::lobOpen()
  • PDO::pgsqlLOBUnlink() => Pdo\Pgsql::lobUnlink()
  • PDO::sqliteCreateAggregate() => Pdo\Sqlite::createAggregate()
  • PDO::sqliteCreateCollation() => Pdo\Sqlite::createCollation()
  • PDO::sqliteCreateFunction() => Pdo\Sqlite::createFunction()

PDO_ODBC

PDO_PGSQL✅

Details

PDO_SQLite✅

Details

PGSQL✅

Details

POSIX✅

Details

Readline✅

Details

Reflection

Session ✅

Details

SOAP✅

Details

Sockets

SPL✅

Details

Sqlite ✅

Details

Standard

Tokenizer✅

Details

XML✅

Details

XSL✅

Details
  • Other changes
    • The $namespace argument of XSLTProcessor::getParameter(), XSLTProcessor::setParameter() and XSLTProcessor::removeParameter() now actually works instead of being treated as empty. This only works if the $name argument does not use Clark notation and is not a QName because in those cases the namespace is taken from the namespace href or prefix respectively. (Document the XSLTProcessor namespace argument in PHP 8.5 #5903)

Zlib

Windows Support

Activity

  1. added this to the PHP 8.5 milestone on Sep 26, 2025
  2. DanielEScherzer commented on Sep 26, 2025

    @DanielEScherzer
    MemberAuthor

    I've generated an initial list of things to document based on the UPGRADING from 8.5.0RC1, excluding the performance improvements section

  3. Fan2Shrek commented on Sep 26, 2025

    @Fan2Shrek
    Contributor

    get_*_handler functions were documented in #4567.

  4. Crell commented on Oct 2, 2025

    @Crell
    Contributor

    Issue filed for the pipe operator: #4890

  5. mumumu commented on Oct 12, 2025

    @mumumu
    Member

    8.5 migration guide PR, ready for review. #4906

  6. vadimonus commented on Jan 8, 2026

    @vadimonus
    Contributor

    @DanielEScherzer , @Crell
    Please take a look at #5083 , it is relevant to pipe operator too

  7. tonurics commented on Mar 11, 2026

    @tonurics

    Notes on undocumented features:

    \Pdo\Sqlite::ATTR_READONLY_STATEMENT is used with the getAttribute() method of a \PDOStatement to return a boolean indicating if the statement will attempt a database write.

    It is not possible to use \Pdo\Sqlite::ATTR_READONLY_STATEMENT with the setAttribute() method.

    Reference: php/php-src@6f9ebe6

    Examples:

    $stmt=$dbh->prepare('SELECT * FROM `table`;');
    echo $stmt->getAttribute(\Pdo\Sqlite::ATTR_READONLY_STATEMENT);
    

    TRUE


    $stmt=$dbh->prepare('DELETE FROM `table`;');
    echo $stmt->getAttribute(\Pdo\Sqlite::ATTR_READONLY_STATEMENT);
    

    FALSE

  8. rbowen commented on Aug 8, 2026

    @rbowen
    Contributor

    Docs contribution onboarding could use some love. It points to the phpdoc@ mailing list which appears to have been largely abandoned as a place to discuss docs. The IRC channel is lonely, and the discord invite link has expired. (I did docs stuff in ancient times, and have been inspired to start helping out again, but can't find where the discussion happens ... unless this is it here?) I'm happy to make these updates but I'm not sure where to find current info.

    Sorry if I'm putting this note the wrong place, but it seemed like the right place.

  9. jordikroon commented on Aug 20, 2026

    @jordikroon
    Member

    @rbowen Thank you for pointing this out. It is actually on my list to improve, together with some other changes to make building the documentation easier across translations.

    Just one thing to confirm. Are you referring to the Discord link at https://phpc.chat? As that seems to be working fine, at least on my end.

  10. rbowen commented on Aug 20, 2026

    @rbowen
    Contributor

    I'll have to check again. I met some old php friends at fossy and was going through the docs onboarding. I'll have to post a more useful/specific report with links. I'll get that done tomorrow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions