UpdraftPlus on PHP 8.6: deprecation notices and the fix
On PHP 8.6 (due 19 November 2026), UpdraftPlus 1.26.14 logs deprecation notices when the affected code runs. We found 17 places in its code that PHP 8.6 flags. Nothing stops working; the notices go to your PHP error log and show on pages where errors are displayed.
Tested on 28 October 2026 with the official PHP 8.6.0RC4 build and WordPress 7.1.1, plugin version 1.26.14 (4,000,000+ active installs) from WordPress.org, activated alone with default settings.
The messages you will see
Deprecated: Function is_integer() is deprecated since 8.6, use is_int() insteadDeprecated: Returning a value from a constructor is deprecatedDeprecated: Function spl_object_hash() is deprecated since 8.6, consider using spl_object_id() insteadDeprecated: Using "is" as a class name is deprecated since 8.6
Where they come from
| File:line | What | When PHP 8.6 complains | In our WordPress test |
|---|---|---|---|
admin.php:6766 | calls is_integer() / is_long()if (is_integer($port)) $ports[] = $port; | When this code runs | not on the pages we opened |
backup.php:1828 | calls is_integer() / is_long()if (is_integer($start_record) || is_array($start_record)) { | When this code runs | not on the pages we opened |
class-updraftplus.php:1697 | calls is_integer() / is_long()if (is_integer($ret)) $ret -= $start_offset; | When this code runs | not on the pages we opened |
class-updraftplus.php:1703 | calls is_integer() / is_long()$returned_bytes = is_integer($ret) ? $ret : strlen($ret); | When this code runs | not on the pages we opened |
class-updraftplus.php:1707 | calls is_integer() / is_long()if (!is_integer($ret) && !fwrite($fh, $ret)) throw new Exception('Write failure (start offset: '.$start_offset.', bytes: | When this code runs | not on the pages we opened |
includes/class-zip.php:372 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
includes/class-zip.php:374 | returns a value from a constructor | Compile time: logged when PHP loads the file | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php:67 (bundled library) | calls spl_object_hash()->exceptionForRequest[spl_object_hash($request)] = $exception; | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php:81 (bundled library) | calls spl_object_hash()$oid = spl_object_hash($request); | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php:196 (bundled library) | calls is_integer() / is_long()if ($this->castIntegerToStringType && $param->getType() == 'string' && is_integer($value)) { | When this code runs | not on the pages we opened |
vendor/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php:274 (bundled library) | calls is_integer() / is_long()} elseif ($t == 'integer' && is_integer($value)) { | When this code runs | not on the pages we opened |
vendor/guzzlehttp/guzzle/src/HandlerStack.php:275 (bundled library) | calls spl_object_hash()return 'callable(' . spl_object_hash($fn) . ')'; | When this code runs | not on the pages we opened |
vendor/guzzlehttp/promises/src/Is.php:5 (bundled library) | bundled Guzzle Promises Is class | Compile time: logged when PHP loads the file | not on the pages we opened |
vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:5554 (bundled library) | calls spl_object_hash()return '{' . spl_object_hash($this) . '}'; | When this code runs | not on the pages we opened |
vendor/rackspace/php-opencloud/lib/OpenCloud/Common/Base.php:294 (bundled library) | calls is_integer() / is_long()if (is_string($info) || is_integer($info)) { | When this code runs | not on the pages we opened |
vendor/symfony/polyfill-php72/Php72.php:94 (bundled library) | calls spl_object_hash()if (null === $hash = spl_object_hash($object)) { | When this code runs | not on the pages we opened |
vendor/symfony/polyfill-php72/Php72.php:170 (bundled library) | calls spl_object_hash()self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); | When this code runs | not on the pages we opened |
The fix
Site owners: you don't need to change anything to keep the site working. Keep display_errors off on the live
site, and update UpdraftPlus when a release mentions PHP 8.6. If a notice shows on your pages, set
define( 'WP_DEBUG_DISPLAY', false ); in wp-config.php.
Plugin developers, line by line:
- calls
is_integer()/is_long(): Useis_int(). - returns a value from a constructor: Change
return โฆ;inside__construct()to a barereturn;.newalways returns the object, so the value was never used. - calls
spl_object_hash(): Usespl_object_id(), or update the bundled library that calls it. - bundled Guzzle Promises
Isclass: This is the bundled Guzzle Promises library'sIsclass. Update the bundledguzzlehttp/promisesto 2.6.0 or 3.1.0 (released 18 October 2026), which use the newStateclass internally.
What a PHP 8.6 deprecation notice does, and what it doesn't
- Nothing stops working on PHP 8.6. A deprecation is a warning that the code will break in a future major version (PHP 9, no date yet). The plugin keeps working.
- It lands in your logs. With
log_errorson (the usual hosting default) every notice goes to the PHP error log, and withWP_DEBUG_LOGtowp-content/debug.log. - It can show on the page. If
display_errorsis on, orWP_DEBUGis on withoutWP_DEBUG_DISPLAYset to false, the notice is printed into the page. That breaks AJAX/JSON responses and can cause "headers already sent" warnings. Keep display off on live sites. - Compile-time notices are logged when PHP compiles the file. With OPcache that happens once after a restart or
cache reset, so you see a few lines, not one per visit. Function notices (
spl_object_hash(),is_integer()โฆ) are logged every time that code runs.
All 39 affected plugins out of the 100 most popular, and the 61 with no findings: PHP 8.6 and WordPress plugins.
Sources
- PHP 8.6 release schedule (GA 19 November 2026)
- php-src PHP-8.6 UPGRADING, section 4: Deprecated functionality
- RFC: Deprecations for PHP 8.6
- RFC: Deprecate returning a value from __construct()
- php.net pre-release builds (8.6.0RC4 used for this test)
- guzzlehttp/promises 2.6.0 / 3.1.0 changelog: Is deprecated, State added (18 October 2026)
- WordPress.org: popular plugins