Auto-generated by script/capability-syntax.php. Do not edit by hand.
User-defined classes, methods, visibility, instanceof, match, and arrow functions.
Builtin functions are in capabilities.md.
Tracking issues: #58, #145, #138, #568 (link closed), #764 (execute closed), #143, #142, #199.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
class / new |
yes | yes | yes | #58 | compliance PHPT; bootstrap AOT; AOT PHPT |
Anonymous class new class { } |
yes | yes | yes | #1233 | php-cfg inline Stmt\Class_ in parseExpr_New; Zend @anonymous\0path:line$id name (#4510, #6281 get_class/static::class); AOT: user AnonymousClass@* methods lowered when PHP_COMPILER_SELFHOST_AOT=1 (#3098) |
Enum declarations enum Foo: string { case Bar = 'x'; } |
yes | yes | yes | #1356 | Backed enum case objects with ->name / ->value; echo $case throws Error (#4891); double-quoted "$case" throws Error (#4785); Foo::Bar singleton fetch; enum_exists registry; implements interface list + instance methods + instanceof (#3373); static methods (#2299); Enum::cases() JIT (#3308, #4068); AOT fixture enum_backed.phpt (#3076); BackedEnum::from() / tryFrom() VM + JIT lookup with Zend-parity ValueError (#3114, #4053); compliance PHPT; AOT PHPT |
Abstract enum abstract enum E { case A; } |
yes | yes | yes | #3737 | Source rewriter + php-cfg flags; new E() fatals; case fetch works on VM |
Instance methods (ClassMethod / Expr_MethodCall) |
yes | yes | yes | #58 | MiniWebApp $router->dispatch() (#2059); compliance PHPT; bootstrap AOT; AOT PHPT |
Static methods on user classes (Expr_StaticCall) |
yes | yes | yes | #2209 | Public static methods without $this; Router::fromConfig() factory (#2059); Late static static::method() tracked separately (#1231) |
Constructors (__construct) |
yes | yes | yes | #145 | Router __construct(array $config) (#2059); compliance PHPT; bootstrap AOT; AOT PHPT |
clone + __clone() magic method |
yes | yes | yes | #3170 | Zend zend_std_clone_object: shallow copy then __clone when defined; VM invokePhpFunction; JIT invokeCloneMagicIfPresent after cloneObject; compliance PHPT |
PHP 8.3+ clone $obj with { prop: $value } |
yes | yes | yes | #4513 | Ast\CloneWithDesugar before php-parser (#4513); lowers to IIFE clone + property writes; Zend/zend_language_parser.y clone_expr with clause; zend_clones.c property overrides; compliance PHPT |
Magic methods __get / __set / __call / __toString |
yes | yes | yes | #146 | Zend zend_object_handlers.c: zend_std_read_property, zend_std_write_property, zend_std_get_method, __toString cast; VM slow path on undeclared property read/write and missing method call; JIT MagicMethodDispatch (#4022, #4066 dynamic $obj->$name); __callStatic (#3273) VM-only; compliance PHPT |
| Private methods | yes | yes | yes | #145 | Router private render* paths (#2059); compliance PHPT; bootstrap AOT; AOT PHPT |
Property fetch $this->x |
yes | yes | yes | #58 | compliance PHPT; bootstrap AOT; AOT PHPT |
| Constructor property promotion | yes | yes | yes | #1359 | Promoted params declare property + assign in __construct |
Method return types (: string / : void) |
yes | yes | yes | #55 | #55 native : string/: int/: bool/: float/: array/: ?T LLVM returns; MCJIT execute #2055; compliance PHPT; bootstrap AOT; AOT PHPT |
Dynamic property access $obj->$name |
yes | yes | yes | #1227 | JIT compares runtime name to declared properties; unknown names abort at runtime; compliance PHPT; AOT PHPT |
Variable function call $fn() |
yes | yes | yes | #56 | VM resolves callee at runtime; JIT when callee name is compile-time string in variable (#56) |
Native user-class link (phpc build --project) |
yes | yes | yes | #764 | AOT link yes (#568 closed); native execute ✅ (#764 closed); compliance PHPT; bootstrap AOT; AOT PHPT |
instanceof |
yes | yes | yes | #138 | compliance PHPT; bootstrap AOT; AOT PHPT |
instanceof union RHS `(A |
B)` | yes | yes | yes | #3461 |
PHP 8.3+ in operator ($needle in $haystack) |
yes | yes | yes | #4682 | Ast\InOperatorDesugar + InOperatorResolver (#4682); VM InOperator::contains (===); JIT TYPE_IN via ArrayBuiltinHelper::inArray strict (#4716); EnumInOperatorJitCompileTest; compliance PHPT; bootstrap AOT; AOT PHPT |
match expression |
yes | yes | yes | #143 | Lowered in php-cfg to === / jump-if / assign (#143); Wave-3 literal-arm subset (#2398); acceptance PHPT (#2428); Guard arms: expression patterns evaluated before === compare; nested match patterns (#3397); match_guard.phpt; Enum case arms: === identity on case singletons, not backed scalar (#4274); match_enum_case.phpt; Arm assignment side effects bind variables when arm matches (#3787); match_arm_assign.phpt; compliance PHPT; bootstrap AOT; AOT PHPT |
Closures function () { } / use ($var) |
yes | yes | yes | #72 | VM ClosureState + __invoke; Closure::bind/bindTo (#3266, #3673); JIT bindTo/bind + bound invoke via ClosureBindHelper (#4192); use() by-value and by-ref (#3081, #3108); array_map/filter/usort callbacks (#3086); JIT ClosureHelper: TYPE_CLOSURE + use() value/ref IR (#3092, #3108); use ($x) MCJIT snapshot via aliasVariableOpFromSlot (#2483); use (&$x) MCJIT via valueBoxAliasPtr (#72, #4625); indirect $arr0 via __closure_target (#3089, #3092); AOT user scripts: real ClosureHelper lowering via PHP_COMPILER_AOT_USER_SCRIPT (#3725); use (&$x) AOT fixture closure_use_byref.phpt (#2483); bootstrap spine still stubs null; bin/jit.php MCJIT execute still probe-dependent (#98); compliance PHPT; AOT PHPT |
Arrow functions fn () => |
yes | yes | yes | #142 | Desugars to TYPE_CLOSURE (#142); VM + JIT + AOT same as closures (#3725); compliance PHPT; AOT PHPT |
Generators (yield / foreach) |
yes | yes | yes | #167 | VM GeneratorState + foreach; keyed yield (#3085); MCJIT/AOT resume lowering for nested generator funcs (#3074, #3115); script-scope yield blocked; JIT linear yield + yield from array/generator delegation (#3074, #4014); try/catch in generator bodies via resume prefixes (#4069); see docs/generators-jit-aot.md; AOT fixture generator_yield.phpt + generator_yield_keys.phpt; compliance PHPT; AOT PHPT |
Fibers (Fiber, Fiber::suspend(), start/resume) |
yes | yes | yes | #3130 | VM FiberState + builtin Fiber class (#3130); php-src Zend/zend_fibers.c; JIT/AOT resume lowering (#4019); MCJIT execute green for nested callbacks (#6437); script-scope suspend still VM-fallback via Block::containsFiberSuspendOpcodesInScriptScope (#4097) |
ClassName::class / static::class |
yes | yes | yes | #740 | Compile-time class name string; related to CLASS (#199); compliance PHPT; bootstrap AOT; AOT PHPT |
Class member constants public / private / protected const |
yes | yes | yes | #2199 | MiniWebApp Router::DEFAULT_CONTACT_NAME_MAX (#2059); JIT: literal class + dynamic const name (#3150); runtime $class::CONST class operand (#4095); compliance PHPT; bootstrap AOT; AOT PHPT |
PHP 8.3 typed class constants (const array X = [1,2];, const string S = 'a';) |
yes | yes | yes | #3592 | Compile-time literal fold for array/scalar const values; typed mismatch is compile-time TypeError; JIT lowers immutable array constants (#3592); Typed trait constants enabled on 8.3+ target (#5993); rejected on 8.2 (Zend parse error parity, #5212) |
PHP 8.3+ file/namespace typed constants (const string X = 'a';) |
yes | yes | yes | #7081 | GlobalTypedConstRewriter + PHPCfg marker for nikic/php-parser 4.x; compile-time type check reuses class-const path |
PHP 8.3 typed interface constants (interface I { public const string X = 'a'; }) |
yes | yes | yes | #5980 | Implements/inheritance typed constant compatibility enforced at compile time (#5953, #5980).; compliance PHPT |
Class constants with new object expressions (PHP 8.3) |
yes | yes | yes | #3196 | Zend zend_compile_const_expr / zend_constants.c — materialize at class definition; shared identity on fetch; VM: ClassConstMaterializer; JIT/AOT: module-global singleton in init (#4021, #4028); MCJIT: ClassConstObjectJitCompileTest + ClassConstObjectJitExecuteTest |
Late static binding static::method() / static::class |
yes | yes | yes | #1231 | VM/JIT called-class propagation; parent::method/class/$prop and static:: LSB (#1858, #3093); child method override AOT fixture extends_method_override.phpt (#2483) |
new static() and : static return type (late-bound class) |
yes | yes | yes | #3412 | VM resolveClassScopeName on TYPE_NEW; returnTypeStatic verify (#3412) |
Magic constants __CLASS__, __METHOD__, __FUNCTION__ |
yes | yes | yes | #199 | Lowered at parse time via php-cfg MagicStringResolver; compliance PHPT |
Magic constant __NAMESPACE__ |
yes | yes | yes | #199 | Requires namespace declaration (#84); compliance PHPT |
Magic constants __DIR__, __FILE__ |
yes | yes | yes | #707 | VM script stack on include; JIT uses per-unit script path; compliance PHPT; bootstrap AOT |
Magic constant __LINE__ |
yes | yes | yes | #715 | Per-site line on TYPE_SCRIPT_MAGIC; include stack for multi-file units; compliance PHPT |
Literal include/require with __DIR__ |
yes | yes | yes | #475 | Compile-time inlining via IncludeHelper; two-file PHPT + MiniWebApp JIT gate (#587) |
foreach by-reference (&$v) |
yes | yes | yes | #1222 | Packed and string-keyed arrays; VM + JIT/AOT lowering (#1222, #4364); AOT: borrowed hashtable entry refs skip valueDelref (IteratorHelper); AOT PHPT: foreach_by_ref.phpt, foreach_by_ref_assoc.phpt |
| foreach over Iterator / IteratorAggregate objects | yes | yes | yes | #4067 | VM + JIT/AOT call rewind/valid/current/key/next (Zend zend_iterators.c parity); IteratorProtocolHelper + IteratorHelper (#4011); IteratorAggregate::getIterator(); TypeError for non-iterable objects; compliance foreach_iterator_jit.phpt |
ArrayAccess interface — $obj[$key] read/write/isset/unset |
yes | yes | yes | #3331 | VM dispatches offsetGet/Set/Exists/Unset (Zend zend_object_handlers.c read_dimension); JIT ArrayAccessHelper + RuntimeIndirectInstanceMethodCall (#4012); Non-ArrayAccess objects keep Illegal offset (abort); compliance PHPT |
By-reference parameters (function f(&$x)) |
yes | yes | yes | #140 | VM TYPE_INDIRECT; JIT aliases caller value* via paramByRef (#3161); Return-by-ref function &f() + $x = &f() on VM (#3414) |
Return-by-reference (function &f() / $x = &f()) |
yes | yes | yes | #4054 | VM + JIT propagate reference cells via FLAG_RETURNS_REF (#3414, #3778); AOT aliases value* return slots (#4054) |
Static property Class::$prop |
yes | yes | yes | #1225 | Class-scoped storage; self:: / static::; runtime property name on JIT/AOT (#4597) |
Error-control operator @ on expressions |
yes | yes | yes | #3546 | php-cfg ErrorSuppressBlock + Simplifier preserve (#3546); VM masks error_reporting; JIT/AOT __compiler_begin_silence / __compiler_end_silence (#4070) |
unset() on variables, array offsets, and object properties |
yes | yes | yes | #2273 | Locals, $this->prop, public properties, string/int keys (#1224); Static properties via TYPE_STATIC_PROPERTY_UNSET (#2256) |
Function-local static $var / static $var = <literal> |
yes | yes | yes | #2286 | Compile-time literal init (int/string/array) plus runtime constant init (new, etc.) — VM + JIT + AOT (#4352, #4027); Uninitialized static $x; with isset guard — Zend parity (#3533); static &$x is not valid PHP syntax (php-src static_var grammar) |
Keyed array destructuring (["a" => $x]) |
yes | yes | yes | #1234 | Skip string-key CFG split for fetch+assign destructuring pairs (#1234) |
goto / labels (function scope) |
yes | yes | yes | #1228 | php-cfg lowers labels to CFG Jump; VM avoids frame nesting on same-block back-edges; AOT native execute via TYPE_JUMP lowering (issue #4042); compliance PHPT; AOT PHPT |
declare(strict_types=1) scalar parameter checks |
yes | yes | yes | #1229 | VM #156; JIT enforces at user call sites via JIT\TypeCheck + Native::compileArg weak casts |
PHP 8.3+ generic array types list<T> / array<K,V> (parameters and properties) |
yes | yes | yes | #3705 | Source rewrite to magic identifier types for php-parser v4; VM list shape check (#3705); Zend generic-array RFC not merged in php-src 8.4 — parity target is proposed list/array forms |
Variable variables ($$name) |
yes | yes | yes | #1226 | php-cfg nests Operand\Variable name; VM resolves runtime local by name; JIT compile-time name fold (#1226); compliance PHPT |
Variable function calls ($fn()) |
yes | yes | yes | #56 | VM resolves callee at runtime; compiler folds literal assignment; JIT uses compile-time string |
Invokable objects ($obj() / __invoke) |
yes | yes | yes | #1232 | Object-typed FuncCall lowered to __invoke method dispatch; VM runtime fallback |
First-class callable syntax (foo(...), Class::m(...)) |
yes | yes | yes | #1363 | php-cfg Expr_FirstClassCallable (#1230); VM/JIT TYPE_FROM_CALLABLE → Closure (#4810); Instance method $obj->m(...) VM + JIT bound [object, method] array callable (#3566, #4040); JIT folds strlen(...) / Class::m(...) via compileTimeString assign chains (#1363); php-types TypeReconstructor patch for Expr_FirstClassCallable (#2315) |
| PHP 8.5 pipe operator (` | >`) | yes | yes | yes | #7219 |
use function / use const imports |
yes | yes | yes | #2325 | php-cfg resolves imported names at parse time; no Stmt_Use lowering required |
Namespace group use (use Foo\{Bar, Baz}) |
yes | yes | yes | #2443 | PhpParser Stmt_GroupUse; NameResolver registers aliases; GroupUseStripper before PHPCfg |
| Flexible heredoc/nowdoc indentation stripping (PHP 7.3+) | yes | yes | yes | #3636 | php-parser Emulative FlexibleDocStringEmulator + parseDocString stripIndentation (#3636); Indented closing label sets docIndentation column; basic heredoc/nowdoc #178; Zend/zend_language_scanner.l flexible heredoc/nowdoc parity; compliance PHPT |
never return type |
yes | yes | yes | #1358 | php-cfg Op\Type\Never_; any return in body is a compile error; normal completion via throw/exit |
Intersection types (A&B) |
yes | yes | yes | #1357 | php-cfg Op\Type\Intersection; VM checks object implements each interface at call |
| DNF types (`(A&B) | null`, union of intersections) | yes | yes | yes | #3094 |
trait declarations with method bodies |
yes | yes | yes | #2312 | VM registers traits in class table with isTrait; trait use in classes is #144; interface_exists/trait_exists distinguish from class_exists |
Simple use Trait; in class body |
yes | yes | yes | #2314 | php-cfg-trait-use.patch; VM merges trait methods into class; JIT/AOT alias trait-merged methods onto using class (#3789); TraitUseAdaptation alias/insteadof/visibility on VM (#3238, #144); Horizontal trait method collision fatals at compile time (#3416) |
Trait use adaptations (as rename, insteadof precedence) |
yes | yes | yes | #3238 | Zend/zend_compile.c trait alias/precedence; VM applyTraitUsesWithAdaptations; JIT/AOT batch trait use with insteadof/as (#2483, #3238); Visibility `as private |
Built-in LazyGhostTrait marker (PHP 8.4 lazy objects) |
yes | yes | yes | #6096 | Zend/zend_lazy_objects.c — internal empty trait; trait_exists true; use in class bodies; ReflectionClass::newLazyGhost on trait-marked classes (#5968) |
Array/argument unpack ...$x |
yes | yes | yes | #1361 | php-cfg spread.patch (#141); VM HashTable::spreadFrom; JIT HashTableHelper::spreadInto + mergeCallArgEntries; compliance PHPT; AOT PHPT |
__serialize / __unserialize magic methods |
yes | yes | yes | #1365 | serialize()/unserialize() call __serialize/__unserialize when present; VM via VmSerialize (#3368) |
| Multi-type catch `catch (A | B $e)` | yes | yes | yes | #1362 |
try / catch / throw |
yes | yes | yes | #57 | throw lowering #195; php-cfg TryCatch overlay (#2084); VM TYPE_TRY/CATCH/THROW/FINALLY; VM finally-before-catch + return-through-finally (#3081, #3106); TryCatchComplianceTest (10 tests); JIT TryCatchHelper IR verify (#3107); bin/jit.php VM fallback via requiresVmLowering (#2114); MCJIT execute probe TryCatchJitExecuteTest; compliance PHPT; bootstrap AOT; AOT PHPT |
throw expressions (PHP 8.0) — throw in expression context |
yes | yes | yes | #3802 | php-cfg Op\Expr\Throw_ overlay (#3802); php-types Expr_Throw type reconstructor patch; Compiler: skip duplicate New before Throw; fresh slot for ?: merge; ?? RHS via compileThrowExpression; VM/JIT reuse TYPE_THROW; compliance throw_expression.phpt (?:, ??, &&); AOT: splitMergeBeforeNestedTry for sequential try merge (#4041); JitThrow LLVM pending globals in standalone; compliance PHPT |
| readonly classes | yes | yes | yes | #1360 | php-cfg Class_::flags MODIFIER_READONLY; VM rejects instance property writes after __construct; JIT ReadonlyClassGuard + readonlyClassIds; bin/jit.php VM fallback via containsReadonlyClassOpcodes (#4082); AOT pending raise + phpc_jit_abort_if_pending_logic_exception; compliance readonly_class_jit.phpt; php-src: Zend/zend_object_handlers.c readonly class write guard |
| readonly properties (per-property) | yes | yes | yes | #3149 | php-cfg readonly / propertyFlags MODIFIER_READONLY; VM/JIT reject writes and unset() after __construct; JIT ReadonlyClassGuard IR + ReadonlyPropertyTest; MCJIT execute + compliance phpt; php-src: Zend/zend_object_handlers.c zend_std_write_property / zend_std_unset_property |
Property hooks (get / set on properties) |
yes | yes | yes | #3145 | SourcePreprocessor lowers hooks to _phpc_property* methods (#3145); Promoted constructor parameters with hook blocks preprocess to promoted param + _phpc_property* methods (#7313); VM dispatches set/get on property access; JIT PropertyHookDispatch (#3723); Static property hooks rejected at compile time (#6619, php-src 8.4 zend_compile.c); AOT: user-class hook methods lower under PHP_COMPILER_SELFHOST_AOT; set-hook smoke in property_hook_set.phpt; JIT: raw backing access in hook bodies via jitPropertyHookRawProperty (set + get methods, #4025, #4205) |
| PHP 8.4 asymmetric property visibility (private(set), protected(set), etc.) | yes | yes | yes | #3165 | Ast\AsymmetricVisibilityRewriter normalizes private(set) for php-parser 4.x; VM/JIT enforce set visibility with catchable Error (#3165, #4020); php-src: Zend/zend_compile.c ZEND_ACC_*_SET; AsymmetricVisibilityGuard + AsymmetricVisibilityJitCompileTest (#4020) |
| User __destruct() | yes | yes | yes | #4096 | VM refcount + shutdown pass (#3144); unset/end-of-scope invoke before later statements (#4096); JIT/AOT: __object__invoke_destructor + phpc_destruct_try_invoke on delref; shutdown via phpc_gc_run_shutdown_destructors (#4013); AOT unset($o) before later statements verified (destruct_unset_echo_4096.php, class_destruct_user.phpt); Cyclic graphs: Zend defers __destruct until gc_collect_cycles(); refcount-zero path runs immediately — see #4023 for gc JIT/AOT; MCJIT execute deferred when harness MCJIT unstable (#98) |
PHP 8 attributes — ReflectionClass / ReflectionMethod metadata |
yes | yes | yes | #1936 | php-cfg preserves attrGroups; compiler stores attribute class names on TYPE_DECLARE_CLASS / TYPE_DECLARE_METHOD; VM reflection reads from VM ClassEntry; JIT/AOT mirror class+method attribute tables into VMContext for reflection; Read path: getAttributes() count + ReflectionAttribute::getName() + newInstance() with compile-time ctor args (#3206, #3216); Parameter/property reflection attributes still deferred; JIT newInstance() deferred (#2467) |
| WeakReference / WeakMap | yes | yes | yes | #3667 | VM: WeakReference::create/get via indirect target slot; unset clears get immediately; GC-backed weak refs via WeakRefRegistry — referent collected by gc_collect_cycles() clears get(); WeakMap uses object-id string keys; entries removed when key object is collected; JIT: WeakRefRegistryRuntime LLVM registry (#3667, #5684) |
Heredoc / nowdoc string literals (<<<LABEL / <<<'LABEL') |
yes | yes | yes | #3187 | php-cfg Scalar_Encapsed → ConcatList; plain heredoc/nowdoc → Scalar_String (#178); PhpParser FlexibleDocStringEmulator (PHP 7.3+ flexible closing labels); php-src Zend/zend_compile.c zend_compile_encapsed_string; compliance PHPT; AOT PHPT |
| DateTime / DateTimeZone OOP | yes | no | no | #3072 | VM builtins: DateTime::__construct/format/getTimestamp/setTimezone; DateTimeZone::__construct; Host PHP date extension for parsing/formatting; UTC and named timezone subset (php-src ext/date/php_datetime.c); JIT/AOT method bodies VM-only in phase 1; VM-only lowering |
Syntax AOT column reflects Runtime::MODE_AOT compile probes unless a row pins AOT (e.g. native user-class link).
Recent stdlib coverage for associative arrays and packed lists. ROADMAP Phase 2/4: #78, assoc arrays #66. Full builtin matrix: capabilities.md.
| Builtin | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
ksort() (string/int keys, preserve values) |
yes | yes | yes | #2271 | String-key hashtable + packed list no-op; assoc subset (#66) |
krsort() (keys descending) |
yes | yes | yes | #2282 | String-key hashtable; packed list no-op |
asort() (values ascending, preserve keys) |
yes | yes | yes | #2290 | Homogeneous string/int values; packed + string-key assoc |
arsort() (values descending, preserve keys) |
yes | yes | yes | #2296 | Homogeneous string/int values; packed + string-key assoc |
rsort() (values descending, reindex) |
yes | yes | yes | #2300 | Packed homogeneous string/int lists; __hashtable__sortPackedReverse |
shuffle() (packed list, Fisher–Yates) |
yes | yes | yes | #2310 | Packed lists without holes; CSPRNG via random_bytes lowering |
array_rand() (packed list keys) |
yes | yes | yes | #2321 | Packed lists; num=1 JIT/AOT; num>1 VM-only; CSPRNG via random_bytes |
array_merge() on string-key associative arrays |
yes | yes | yes | #2287 | String-key maps; packed list append unchanged |
Rows curated from closed stdlib issues (#2271, #2282, #2290, #2296, #2300, #2287); regenerate via php script/capability-syntax.php.
PATH_INFO routing, deploy-root includes, and CGI drivers for the reference web app. ROADMAP Phase 3/4: #78, runtime tracker #539. Builtin matrix: capabilities.md.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
PATH_INFO / ?route= fallback |
yes | partial | partial | #489 | #489 VM closed; AOT execute ✅ (#764 closed); default-off gates #1760 |
phpc_deploy_path() + PHPC_DEPLOY_ROOT |
yes | partial | partial | #585 | #585 closed; deploy includes #623; execute ✅ (#764 closed); gates #1760 |
Runtime template include from deploy tree |
yes | no | partial | #623 | #623 VM/AOT lint; execute ✅ (#764 closed); gates #1760 |
CGI/1.1 driver (bin/cgi.php) |
yes | n/a | n/a | #50 | #50 VM closed; #656 CgiDriverTest; #666 MiniWebApp PATH_INFO |
AOT CGI (cgi-wrapper + phpc cgi) |
n/a | n/a | partial | #665 | #665 closed; 001 green; 003 execute ✅ (#764 closed); #682; gates #1760 |
| FastCGI loop | partial | n/a | partial | #173 | bin/fcgi.php + phpc fcgi; FASTCGI_SMOKE_GATE=1 (#173, #1899) |
Web rows are curated from ROADMAP issue state; native link #568 closed; AOT execute #764 closed; default-off CI gates #1760.
Class methods, visibility, constructors, and return types for the MiniWebApp Router. ROADMAP Phase 1/4: #78, acceptance #2059. Builtin matrix: capabilities.md.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
003-MiniWebApp Router OOP (VM serve) |
yes | partial | yes | #2059 | #2059 VM OOP e2e; lint zero (#2078); serve smoke default-on; JIT project opt-in (#587) |
Public instance methods (Expr_MethodCall) |
yes | partial | yes | #58 | #58 ClassMethod + method dispatch; compliance PHPT; native execute ✅ (#764 closed) |
Static methods (Expr_StaticCall) |
yes | partial | yes | #2209 | #2209 user static methods; factory Class::method() + instance chain |
Private methods + __construct |
yes | partial | yes | #145 | #145 visibility + ctor; Router private render paths |
Method return types (: string / : void) |
yes | yes | yes | #55 | #55 native scalar/array returns; nullable via value*; MCJIT execute #2055 |
OOP rows are curated from ROADMAP issue state; methods #58; visibility/ctor #145; return types #55. Opt-in gates: MINIWEBAPP_VM_OOP_GATE (#2189), MINIWEBAPP_JIT_PROJECT_GATE (#587); drift guard CAPABILITIES_OOP_SYNC_GATE (#2190).
File-backed $_SESSION flash across HTTP requests for the sessions north-star example.
ROADMAP Phase 4/5: #78, tracker #1881. Builtin matrix: capabilities.md.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
005-SessionsWeb reference app |
yes | yes | yes | #1881 | #1881 VM serve + session smoke (#1887); AOT link #1946; execute #1891; ci-local gates opt-in (#1923, #1967) |
session_start / $_SESSION flash across requests |
yes | yes | yes | #1938 | #1882 JIT; AOT persistence #1938; two-request execute #1891 |
AOT project link (phpc build --project) |
n/a | n/a | yes | #1946 | ExamplesCompileTest link-before-execute (#1946); SESSIONS_WEB_AOT_LINK_GATE opt-in |
| AOT CLI execute (two-request session flash) | n/a | n/a | yes | #1891 | SessionsWebAotExecuteTest; opt-in SESSIONS_WEB_AOT_SMOKE_GATE (#1923) |
Sessions rows are curated from ROADMAP issue state; AOT persistence #1938; link #1946; execute #1891. Opt-in ci-local gates: SESSIONS_WEB_AOT_SMOKE_GATE, SESSIONS_WEB_DEPLOY_SMOKE_GATE.
Nested $_FILES and move_uploaded_file() for the multipart upload north-star example.
ROADMAP Phase 4/5: #78, tracker #1999. Builtin matrix: capabilities.md.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
006-FileUploadWeb reference app |
yes | yes | yes | #1999 | #1999 VM serve + multipart smoke (#2009); AOT link #2011; execute #2012 (FILE_UPLOAD_WEB_AOT_SMOKE_GATE default-on) |
multipart $_POST / nested $_FILES (web runtime) |
yes | yes | yes | #87 | #52 multipart POST; #87 nested keys; AOT CGI REQUEST_BODY (#2012) |
AOT project link (phpc build --project) |
n/a | n/a | yes | #2011 | ExamplesCompileTest::test006FileUploadWebAotLink; FILE_UPLOAD_WEB_AOT_LINK_GATE default-on |
| AOT CGI execute (multipart upload probe) | n/a | n/a | yes | #2012 | FileUploadWebAotExecuteTest; FILE_UPLOAD_WEB_AOT_SMOKE_GATE default-on (#2012) |
| AOT deploy CGI (multipart upload smoke) | n/a | n/a | yes | #2028 | deploy-smoke.sh --example 006; opt-in FILE_UPLOAD_WEB_DEPLOY_SMOKE_GATE (#2028, #2038) |
File upload rows are curated from ROADMAP issue state; multipart #52; nested FILES #87; move_uploaded_file #2005; deploy #2028. Opt-in ci-local gates: FILE_UPLOAD_WEB_SMOKE_GATE, FILE_UPLOAD_WEB_AOT_LINK_GATE, FILE_UPLOAD_WEB_AOT_SMOKE_GATE (execute default-on #2012), FILE_UPLOAD_WEB_DEPLOY_SMOKE_GATE.
Caught throw / catch on invalid POST for the throws north-star example.
ROADMAP Phase 4/5: #78, tracker #2076. Builtin matrix: capabilities.md.
| Construct | VM | JIT | AOT | Issue | Notes |
|---|---|---|---|---|---|
007-ThrowsWeb reference app |
yes | yes | yes | #2076 | #2076 VM serve + caught invalid POST (THROWS_WEB_SMOKE_GATE default #2125); AOT link/execute default #2135 |
throw / catch on invalid POST (web serve) |
yes | yes | yes | #195 | #195 throw lowering; #57 catch; #2084 compliance PHPT pack; empty user class JIT #2167; AOT #2157 |
AOT project link (phpc build --project) |
n/a | n/a | yes | #2101 | ExamplesCompileTest 007 link; THROWSWEB_AOT_LINK_GATE default-on (#2135) |
| AOT CGI execute (caught throw probe) | n/a | n/a | yes | #2104 | examples-aot-smoke 007 slice; THROWSWEB_AOT_SMOKE_GATE default-on (#2135) |
Throws rows are curated from ROADMAP issue state; throw #195; try/catch #57; overlay #2084. ci-local gates: THROWS_WEB_SMOKE_GATE (VM serve default-on #2125), THROWSWEB_AOT_LINK_GATE / THROWSWEB_AOT_SMOKE_GATE (AOT default-on #2135; set 0 to skip).