feat: target PHP 8.6 - #278
Merged
Merged
Conversation
The 8.5 maintenance branch takes over PHP 8.5 support while master moves on to PHP 8.6. Fixes affecting 8.4 now cascade through 8.5 before reaching master. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
Master moves on to PHP 8.6 (currently in beta); PHP 8.5 support continues on the new 8.5 maintenance branch. Bumps the boot guard, composer platform requirement and dev-master alias (8.6.x-dev), PHPStan phpVersion, CI PHP_MINOR, docker base images, generator defaults and docs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
Generated natively from PHP 8.6.0beta2 (php-src tag php-8.6.0beta2). darwin-* and windows-* artifacts follow via the generation workflows once 8.6 builds are available on those runners. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
…P 8.6 - NodeKind: AST_PLACEHOLDER_ARG added, AST_METHOD_REFERENCE renamed to AST_TRAIT_METHOD_REFERENCE, AST_PARENT_PROPERTY_HOOK_CALL removed, AST_PIPE and AST_CONST_ENUM_INIT renumbered - OpCode: TYPE_ASSERT, CALLABLE_CONVERT_PARTIAL, SEND_PLACEHOLDER (211-213) - zend_closure.this_ptr is a zend_object* since 8.6 (was a zval): ClosureEntry::setThis() and GetClosureHook now bind through object refcounts instead of zval copies - generator: extract ZEND_INTERNAL_FUNCTION/ZEND_USER_FUNCTION/ZEND_EVAL_CODE from the new zend_function_type C23 enum; ClangAstIndex prefers a defining enum declaration over the forward declaration C23_ENUM expands to - regenerate linux artifacts from release builds (constants now carry the function-type enum and ZEND_DEBUG=0) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
- extract zend_class_type (ZEND_INTERNAL_CLASS/ZEND_USER_CLASS) as an enum: ce->type is a uint8-typed enum since 8.6, no longer a char - drop the ord() reads in ReflectionClass and ClassSpecializer - internal functions' arg_info is converted to zend_arg_info entries with interned zend_string names at registration since 8.6: getArgumentInfo() reads one shared entry layout for user and internal functions - zend_hash_index_add_or_update: 8.6 asserts HASH_ADD_NEW only appears combined with HASH_ADD; HashTable::addIndex() now passes HASH_ADD, which also makes its duplicate-key check actually work - redefine-churn scenario: call swapped functions through runtime-opaque names (the 8.6 optimizer constant-folds calls it can resolve at compile time) and spawn leak-gate children with opcache off like the CI internal leg - the SHM copy-out caveat for pre-existing instances is unchanged behaviour, see docs/hot-swap.md - ReflectionMethod::invoke() deprecation for static methods in a test helper - pin PHPStan phpVersion at 80500 until 2.x accepts 80600 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
- php-cs-fixer: allow running on PHP 8.6 while the fixer does not list it as supported yet (no 8.6-only syntax in the codebase) - generator native mode: snapshot builds (X.Y.Z-dev, setup-php nightlies) have no php-src release tag - fall back to the PHP-X.Y branch and then master for the three sliced sources; drift against the running build is still caught by the probe/validate stage - generator windows mode: skip cleanly when windows.php.net has no build or devel pack for a snapshot version - the CI presence guards keep the gap visible and the leg self-heals on the first tagged build - generator docker mode + ci: while Docker publishes only the -rc image family for a pre-release minor, resolve php:X.Y-rc-cli/-zts as the base for the header-drift and debug-build legs; self-heals to the stable tags at GA Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
The generator now exits 0 with a SKIPPED notice when windows.php.net has no build or devel pack for a snapshot PHP version; record that in a step output so the smoke-check and artifact upload do not demand files no run could have produced. Self-heals on the first tagged 8.6 build. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WvwX3zFemZVZENmF3fSrcE
lisachenko
marked this pull request as ready for review
August 29, 2026 06:25
This was referenced Aug 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Master moves on to PHP 8.6 (currently 8.6.0beta2); PHP 8.5 support continues on the new
8.5branch, snapshotted from master before this change.Branch model
8.4 => 8.5 => master (8.6)in.github/branch-flow.json. The same map is on the8.5branch; chore: extend cascade flow to 8.4 => 8.5 => master #276 applies it to8.4(merge-up resolves the successor from the pushed branch's own copy).composer.json: platform requirement~8.6.0,dev-masterbranch alias →8.6.x-dev.Version bump
Boot guard
[80600, 80700),PHP_MINOR: '8.6'in all four workflows, docker base images, generator defaults, README/AGENTS/CONTRIBUTING/issue-template docs.Generated engine definitions
include/8.6/linux-x64-{nts,zts}generated natively from php-src tagphp-8.6.0beta2(NTS from a release build, ZTS from a release ZTS build compiled for this purpose), plus regeneratedstubs/zend-engine-structs.phpand.phpstorm.meta.php. darwin-* and windows-* artifacts land via the generation workflows once those runners have 8.6 builds, same staging as the 8.5 cycle.Engine changes 8.6 required
zend_function_type/zend_class_typeC23 enums: theZEND_*_FUNCTION/ZEND_*_CLASS#defines became typeduint8_tenums (same values). The generator now extracts both enums (ClangAstIndexlearned to prefer a defining enum declaration over the forward declarationC23_ENUMexpands to), andce->typereads dropped theirord()(FFI returns int, not a 1-char string).zend_closure.this_ptris azend_object *(was a zval):ClosureEntry::setThis()andGetClosureHookbind through object refcounts.arg_infois converted tozend_arg_info(internedzend_stringnames, NULL name on the return entry) at registration:getArgumentInfo()now reads one entry layout for user and internal functions.AST_PLACEHOLDER_ARGadded,AST_METHOD_REFERENCE→AST_TRAIT_METHOD_REFERENCE,AST_PARENT_PROPERTY_HOOK_CALLremoved,AST_PIPE/AST_CONST_ENUM_INITrenumbered. New opcodes 211–213 (TYPE_ASSERT,CALLABLE_CONVERT_PARTIAL,SEND_PLACEHOLDER).zend_hash_index_add_or_updateassertsHASH_ADD_NEWonly combined withHASH_ADD;HashTable::addIndex()now passesHASH_ADD(which also makes its duplicate-key check meaningful).phpVersionstays at80500until PHPStan accepts80600(2.2.9 still caps at 8.5).Validation (PHP 8.6.0beta2, linux-x64-nts debug build)
--group internal --process-isolationgreen; opcache-runner leg (opcache.enable_cli=1) green;--group opcache --fail-on-skippedgreen (70 tests).CI notes: macOS/Windows legs skip cleanly until their 8.6 artifacts are generated by the dedicated workflows; setup-php needs a 8.6 build on the runners for the linux legs (pre-release), and
composer installunder a pre-release 8.6 needs--ignore-platform-req=phpuntil GA.Generated by Claude Code