PHP capability comparison

How tracked PHP language and stdlib features (reference: php-src / Zend PHP) compare to php-compiler on VM, JIT, and AOT. This is not a full php-src inventory — only items we measure in capabilities-syntax.md and capabilities.md. Generated 2026-06-02 (matrix mtime).

Language constructs
78 / 83 full (VM+JIT+AOT)

1 partial · 4 gaps

Stdlib builtins
468 / 486 full (VM+JIT+AOT)

18 partial · 0 gaps

Legend

yes supported · partial subset · no not yet · PHP column = reference has the feature

Language constructs

Classes, control flow, types, and related syntax from the language matrix.

FeaturePHPVMJITAOTIssue
`class` / `new`yesyesyesyes#58
Anonymous class `new class { }`yesyesyesyes#1233
Enum declarations `enum Foo: string { case Bar = 'x'; }`yesyesyesyes#1356
Abstract enum `abstract enum E { case A; }`yesyesyesyes#3737
Instance methods (`ClassMethod` / `Expr_MethodCall`)yesyesyesyes#58
Static methods on user classes (`Expr_StaticCall`)yesyesyesyes#2209
Constructors (`__construct`)yesyesyesyes#145
`clone` + `__clone()` magic methodyesyesyesyes#3170
Magic methods `__get` / `__set` / `__call` / `__toString`yesyesyesyes#146
Private methodsyesyesyesyes#145
Property fetch `$this->x`yesyesyesyes#58
Constructor property promotionyesyesyesyes#1359
Method return types (`: string` / `: void`)yesyesyesyes#55
Dynamic property access `$obj->$name`yesyesyesyes#1227
Variable function call `$fn()`yesyesyesyes#56
Native user-class link (`phpc build --project`)yesyesyesyes#764
`instanceof`yesyesyesyes#138
`instanceof` union RHS `(AyesB)`yesyesyes
`match` expressionyesyesyesyes#143
Closures `function () { }` / `use ($var)`yesyesyesyes#72
Arrow functions `fn () =>`yesyesyesyes#142
Generators (`yield` / `foreach`)yesyesyesyes#167
Fibers (`Fiber`, `Fiber::suspend()`, start/resume)yesyesyesyes#3130
`ClassName::class` / `static::class`yesyesyesyes#740
Class member constants `public` / `private` / `protected const`yesyesyesyes#2199
PHP 8.3 typed class constants (`const array X = [1,2];`, `const string S = 'a';`)yesyesyesyes#3592
Class constants with `new` object expressions (PHP 8.3)yesyesyesyes#3196
Late static binding `static::method()` / `static::class`yesyesyesyes#1231
`new static()` and `: static` return type (late-bound class)yesyesyesyes#3412
Magic constants `__CLASS__`, `__METHOD__`, `__FUNCTION__`yesyesyesyes#199
Magic constant `__NAMESPACE__`yesyesyesyes#199
Magic constants `__DIR__`, `__FILE__`yesyesyesyes#707
Magic constant `__LINE__`yesyesyesyes#715
Literal `include`/`require` with `__DIR__`yesyesyesyes#475
foreach by-reference (`&$v`)yesyesyesyes#1222
foreach over Iterator / IteratorAggregate objectsyesyesyesyes#4067
ArrayAccess interface — `$obj[$key]` read/write/isset/unsetyesyesyesyes#3331
By-reference parameters (`function f(&$x)`)yesyesyesyes#140
Return-by-reference (`function &f()` / `$x = &f()`)yesyesyesyes#4054
Static property `Class::$prop`yesyesyesyes#1225
Error-control operator `@` on expressionsyesyesyesyes#3546
`unset()` on variables, array offsets, and object propertiesyesyesyesyes#2273
Function-local `static $var` / `static $var = <literal>`yesyesyesyes#2286
Keyed array destructuring (`["a" => $x]`)yesyesyesyes#1234
`goto` / labels (function scope)yesyesyesyes#1228
`declare(strict_types=1)` scalar parameter checksyesyesyesyes#1229
PHP 8.3+ generic array types `list<T>` / `array<K,V>` (parameters and properties)yesyesyesyes#3705
Variable variables (`$$name`)yesyesyesyes#1226
Variable function calls (`$fn()`)yesyesyesyes#56
Invokable objects (`$obj()` / `__invoke`)yesyesyesyes#1232
First-class callable syntax (`foo(...)`, `Class::m(...)`)yesyesyesyes#1363
PHP 8.4+ pipe operator (`yes>`)yesyesyes
`use function` / `use const` importsyesyesyesyes#2325
Namespace group use (`use Foo\{Bar, Baz}`)yesyesyesyes#2443
Flexible heredoc/nowdoc indentation stripping (PHP 7.3+)yesyesyesyes#3636
`never` return typeyesyesyesyes#1358
Intersection types (`A&B`)yesyesyesyes#1357
DNF types (`(A&B)yesnull`, union of intersections)yesyesyes
`trait` declarations with method bodiesyesyesyesyes#2312
Simple `use Trait;` in class bodyyesyesyesyes#2314
Trait use adaptations (`as` rename, `insteadof` precedence)yesyesyesyes#3238
Array/argument unpack `...$x`yesyesyesyes#1361
`__serialize` / `__unserialize` magic methodsyesyesyesyes#1365
Multi-type catch `catch (AyesB $e)`yesyesyes
`try` / `catch` / `throw`yesyesyesyes#57
throw expressions (PHP 8.0) — `throw` in expression contextyesyesyesyes#3802
readonly classesyesyesyesyes#1360
readonly properties (per-property)yesyesyesyes#3149
Property hooks (`get` / `set` on properties)yesyesyesyes#3145
PHP 8.4 asymmetric property visibility (public private(set), etc.)yesyesyesyes#3165
User __destruct()yesyesyesyes#4096
PHP 8 attributes — `ReflectionClass` / `ReflectionMethod` metadatayesyesyesyes#1936
WeakReference / WeakMapyesyesyesyes#3667
Heredoc / nowdoc string literals (`<<<LABEL` / `<<<'LABEL'`)yesyesyesyes#3187
DateTime / DateTimeZone OOPyesyesnono#3072
`ksort()` (string/int keys, preserve values)yesyesyesyes#2271
`krsort()` (keys descending)yesyesyesyes#2282
`asort()` (values ascending, preserve keys)yesyesyesyes#2290
`arsort()` (values descending, preserve keys)yesyesyesyes#2296
`rsort()` (values descending, reindex)yesyesyesyes#2300
`shuffle()` (packed list, Fisher–Yates)yesyesyesyes#2310
`array_rand()` (packed list keys)yesyesyesyes#2321
`array_merge()` on string-key associative arraysyesyesyesyes#2287

Stdlib builtins

Internal functions registered in ext/standard and ext/types.

FeaturePHPVMJITAOTIssue
`__compiler_is_superglobal_name`yesyesyesyes
`__halt_compiler`yesyesyesyes
`abs`yesyesyesyes
`acos`yesyesyesyes
`addcslashes`yesyesyesyes
`addslashes`yesyesyesyes
`array_all`yesyesnono
`array_any`yesyesnono
`array_change_key_case`yesyesyesyes
`array_chunk`yesyesyesyes
`array_column`yesyesyesyes
`array_combine`yesyesyesyes
`array_count_values`yesyesyesyes
`array_diff`yesyesyesyes
`array_fill`yesyesyesyes
`array_fill_keys`yesyesyesyes
`array_filter`yesyesyesyes
`array_find`yesyesnono
`array_find_key`yesyesnono
`array_first`yesyesyesyes
`array_flip`yesyesyesyes
`array_intersect`yesyesyesyes
`array_is_list`yesyesyesyes
`array_key_exists`yesyesyesyes
`array_key_first`yesyesyesyes
`array_key_last`yesyesyesyes
`array_keys`yesyesyesyes
`array_last`yesyesyesyes
`array_map`yesyesyesyes
`array_merge`yesyesyesyes
`array_merge_recursive`yesyesyesyes
`array_multisort`yesyesyesyes
`array_pad`yesyesyesyes
`array_pop`yesyesyesyes
`array_product`yesyesyesyes
`array_push`yesyesyesyes
`array_rand`yesyesyesyes
`array_reduce`yesyesyesyes
`array_replace`yesyesyesyes
`array_replace_recursive`yesyesyesyes
`array_reverse`yesyesyesyes
`array_search`yesyesyesyes
`array_shift`yesyesyesyes
`array_slice`yesyesyesyes
`array_splice`yesyesyesyes
`array_sum`yesyesyesyes
`array_unique`yesyesyesyes
`array_unshift`yesyesyesyes
`array_values`yesyesyesyes
`array_walk`yesyesyesyes
`array_walk_recursive`yesyesnono
`arsort`yesyesyesyes
`asin`yesyesyesyes
`asort`yesyesyesyes
`assert`yesyesyesyes
`atan`yesyesyesyes
`atan2`yesyesyesyes
`base64_decode`yesyesyesyes
`base64_encode`yesyesyesyes
`base_convert`yesyesyesyes
`basename`yesyesyesyes
`bin2hex`yesyesyesyes
`bindec`yesyesyesyes
`boolval`yesyesyesyes
`ceil`yesyesyesyes
`chdir`yesyesyesyes
`chgrp`yesyesyesyes
`chmod`yesyesyesyes
`chown`yesyesyesyes
`chr`yesyesyesyes
`chunk_split`yesyesyesyes
`class_alias`yesyesyesyes
`class_exists`yesyesyesyes
`class_implements`yesyesyesyes
`class_parents`yesyesyesyes
`class_uses`yesyesyesyes
`clearstatcache`yesyesyesyes
`closedir`yesyesyesyes
`compact`yesyesyesyes
`constant`yesyesyesyes
`convert_uudecode`yesyesyesyes
`convert_uuencode`yesyesyesyes
`copy`yesyesyesyes
`cos`yesyesyesyes
`cosh`yesyesyesyes
`count`yesyesyesyes
`count_chars`yesyesyesyes
`crc32`yesyesyesyes
`crc32c`yesyesyesyes
`crypt`yesyesyesyes
`date`yesyesyesyes
`debug_backtrace`yesyesyesyes
`decbin`yesyesyesyes
`dechex`yesyesyesyes
`decoct`yesyesyesyes
`define`yesyesyesyes
`defined`yesyesyesyes
`deg2rad`yesyesyesyes
`dirname`yesyesyesyes
`disk_free_space`yesyesyesyes
`disk_total_space`yesyesyesyes
`diskfreespace`yesyesyesyes
`disktotalspace`yesyesyesyes
`dl`yesyesyesyes
`doubleval`yesyesyesyes
`enum_exists`yesyesyesyes
`error_clear_last`yesyesyesyes
`error_get_last`yesyesyesyes
`error_reporting`yesyesyesyes
`escapeshellarg`yesyesyesyes
`escapeshellcmd`yesyesyesyes
`eval`yesyesyesyes
`exp`yesyesyesyes
`explode`yesyesyesyes
`expm1`yesyesyesyes
`extension_loaded`yesyesyesyes
`extract`yesyesyesyes
`fclose`yesyesyesyes
`fdiv`yesyesyesyes
`feof`yesyesyesyes
`fflush`yesyesyesyes
`fgetc`yesyesyesyes
`fgetcsv`yesyesyesyes
`fgets`yesyesyesyes
`file`yesyesyesyes
`file_exists`yesyesyesyes
`file_get_contents`yesyesyesyes
`file_put_contents`yesyesyesyes
`fileatime`yesyesyesyes
`filectime`yesyesyesyes
`filegroup`yesyesyesyes
`fileinode`yesyesyesyes
`filemtime`yesyesyesyes
`fileowner`yesyesyesyes
`fileperms`yesyesyesyes
`filesize`yesyesyesyes
`filetype`yesyesyesyes
`filter_input`yesyesyesyes
`filter_var`yesyesyesyes
`floatval`yesyesyesyes
`flock`yesyesyesyes
`floor`yesyesyesyes
`flush`yesyesyesyes
`fmod`yesyesyesyes
`fnmatch`yesyesyesyes
`fopen`yesyesyesyes
`forward_static_call`yesyesyesyes
`forward_static_call_array`yesyesyesyes
`fpassthru`yesyesyesyes
`fputcsv`yesyesyesyes
`fread`yesyesyesyes
`frexp`yesyesyesyes
`fseek`yesyesyesyes
`fstat`yesyesyesyes
`ftell`yesyesyesyes
`ftruncate`yesyesyesyes
`func_get_args`yesyesyesyes
`func_num_args`yesyesyesyes
`function_exists`yesyesyesyes
`fwrite`yesyesyesyes
`gc_collect_cycles`yesyesyesyes
`gc_disable`yesyesnono
`gc_enable`yesyesnono
`gc_enabled`yesyesnono
`get_called_class`yesyesyesyes
`get_class`yesyesyesyes
`get_class_methods`yesyesyesyes
`get_class_vars`yesyesyesyes
`get_debug_type`yesyesyesyes
`get_declared_classes`yesyesyesyes
`get_declared_enums`yesyesyesyes
`get_declared_functions`yesyesyesyes
`get_declared_interfaces`yesyesyesyes
`get_declared_traits`yesyesyesyes
`get_defined_constants`yesyesyesyes
`get_defined_functions`yesyesyesyes
`get_defined_vars`yesyesyesyes
`get_html_translation_table`yesyesyesyes
`get_loaded_extensions`yesyesyesyes
`get_mangled_object_vars`yesyesnono
`get_meta_tags`yesyesyesyes
`get_object_id`yesyesyesyes
`get_object_vars`yesyesyesyes
`get_parent_class`yesyesyesyes
`get_resource_id`yesyesyesyes
`get_resources`yesyesyesyes
`getallheaders`yesyesyesyes
`getcwd`yesyesyesyes
`getdate`yesyesyesyes
`getenv`yesyesyesyes
`gethostbynamel`yesyesyesyes
`gethostname`yesyesyesyes
`getmygrgid`yesyesyesyes
`getmyinode`yesyesyesyes
`getmypid`yesyesyesyes
`getprotobyname`yesyesyesyes
`getprotobynumber`yesyesyesyes
`getrusage`yesyesyesyes
`getservbyname`yesyesyesyes
`getservbyport`yesyesyesyes
`gettimeofday`yesyesyesyes
`gettype`yesyesyesyes
`glob`yesyesyesyes
`gmdate`yesyesyesyes
`gzcompress`yesyesnono
`gzdecode`yesyesnono
`gzdeflate`yesyesnono
`gzencode`yesyesnono
`gzinflate`yesyesnono
`gzuncompress`yesyesnono
`hash`yesyesyesyes
`hash_equals`yesyesyesyes
`hash_hmac`yesyesyesyes
`hash_pbkdf2`yesyesyesyes
`header`yesyesyesyes
`header_list`yesyesyesyes
`header_register_callback`yesyesyesyes
`header_remove`yesyesyesyes
`headers_list`yesyesnono
`headers_sent`yesyesyesyes
`hex2bin`yesyesyesyes
`hexdec`yesyesyesyes
`highlight_file`yesyesyesyes
`highlight_string`yesyesyesyes
`hrtime`yesyesyesyes
`html_entity_decode`yesyesyesyes
`htmlentities`yesyesyesyes
`htmlspecialchars`yesyesyesyes
`htmlspecialchars_decode`yesyesyesyes
`http_build_query`yesyesyesyes
`http_response_code`yesyesyesyes
`hypot`yesyesyesyes
`implode`yesyesyesyes
`in_array`yesyesyesyes
`ini_get`yesyesyesyes
`ini_set`yesyesyesyes
`intdiv`yesyesyesyes
`interface_exists`yesyesyesyes
`intval`yesyesyesyes
`is_a`yesyesyesyes
`is_array`yesyesyesyes
`is_bool`yesyesyesyes
`is_countable`yesyesyesyes
`is_dir`yesyesyesyes
`is_double`yesyesyesyes
`is_executable`yesyesyesyes
`is_file`yesyesyesyes
`is_finite`yesyesyesyes
`is_float`yesyesyesyes
`is_infinite`yesyesyesyes
`is_int`yesyesyesyes
`is_integer`yesyesyesyes
`is_iterable`yesyesyesyes
`is_link`yesyesyesyes
`is_long`yesyesyesyes
`is_nan`yesyesyesyes
`is_null`yesyesyesyes
`is_numeric`yesyesyesyes
`is_object`yesyesyesyes
`is_readable`yesyesyesyes
`is_resource`yesyesyesyes
`is_scalar`yesyesyesyes
`is_string`yesyesyesyes
`is_subclass_of`yesyesyesyes
`is_uploaded_file`yesyesyesyes
`is_writable`yesyesyesyes
`iterator_apply`yesyesyesyes
`iterator_count`yesyesyesyes
`iterator_to_array`yesyesyesyes
`join`yesyesyesyes
`json_decode`yesyesyesyes
`json_encode`yesyesyesyes
`json_last_error`yesyesyesyes
`json_last_error_msg`yesyesyesyes
`json_validate`yesyesyesyes
`krsort`yesyesyesyes
`ksort`yesyesyesyes
`lcfirst`yesyesyesyes
`lchgrp`yesyesyesyes
`lchown`yesyesyesyes
`ldexp`yesyesyesyes
`levenshtein`yesyesyesyes
`link`yesyesyesyes
`log`yesyesyesyes
`log10`yesyesyesyes
`log1p`yesyesyesyes
`lstat`yesyesyesyes
`ltrim`yesyesyesyes
`max`yesyesyesyes
`mb_strlen`yesyesyesyes
`md5`yesyesyesyes
`md5_file`yesyesyesyes
`memory_get_peak_usage`yesyesyesyes
`memory_get_usage`yesyesyesyes
`metaphone`yesyesyesyes
`method_exists`yesyesyesyes
`microtime`yesyesyesyes
`min`yesyesyesyes
`mkdir`yesyesyesyes
`modf`yesyesyesyes
`move_uploaded_file`yesyesyesyes
`natcasesort`yesyesyesyes
`natsort`yesyesyesyes
`nl2br`yesyesyesyes
`number_format`yesyesyesyes
`ob_end_clean`yesyesyesyes
`ob_end_flush`yesyesyesyes
`ob_get_clean`yesyesyesyes
`ob_get_contents`yesyesyesyes
`ob_get_length`yesyesyesyes
`ob_get_level`yesyesyesyes
`ob_get_status`yesyesyesyes
`ob_implicit_flush`yesyesyesyes
`ob_start`yesyesyesyes
`octdec`yesyesyesyes
`opendir`yesyesyesyes
`ord`yesyesyesyes
`pack`yesyesyesyes
`parse_str`yesyesyesyes
`parse_url`yesyesyesyes
`password_get_info`yesyesyesyes
`password_hash`yesyesyesyes
`password_needs_rehash`yesyesyesyes
`password_verify`yesyesyesyes
`pathinfo`yesyesyesyes
`php_sapi_name`yesyesyesyes
`php_uname`yesyesyesyes
`phpc_deploy_path`yesyesyesyes
`phpc_run_command`yesyesyesyes
`phpversion`yesyesyesyes
`pi`yesyesyesyes
`pow`yesyesyesyes
`preg_filter`yesyesyesyes
`preg_grep`yesyesyesyes
`preg_last_error`yesyesyesyes
`preg_last_error_msg`yesyesyesyes
`preg_match`yesyesyesyes
`preg_match_all`yesyesyesyes
`preg_quote`yesyesyesyes
`preg_replace`yesyesyesyes
`preg_replace_callback`yesyesyesyes
`preg_split`yesyesyesyes
`print_r`yesyesnono
`printf`yesyesyesyes
`property_exists`yesyesyesyes
`putenv`yesyesyesyes
`quoted_printable_decode`yesyesyesyes
`quoted_printable_encode`yesyesyesyes
`quotemeta`yesyesyesyes
`rad2deg`yesyesyesyes
`random_bytes`yesyesyesyes
`random_int`yesyesyesyes
`range`yesyesyesyes
`rawurldecode`yesyesyesyes
`rawurlencode`yesyesyesyes
`readdir`yesyesyesyes
`readfile`yesyesyesyes
`readline`yesyesyesyes
`readlink`yesyesyesyes
`realpath`yesyesyesyes
`register_shutdown_function`yesyesyesyes
`rename`yesyesyesyes
`restore_error_handler`yesyesyesyes
`restore_exception_handler`yesyesyesyes
`rewind`yesyesyesyes
`rewinddir`yesyesyesyes
`rmdir`yesyesyesyes
`round`yesyesyesyes
`rsort`yesyesyesyes
`rtrim`yesyesyesyes
`scandir`yesyesyesyes
`serialize`yesyesyesyes
`session_destroy`yesyesyesyes
`session_id`yesyesyesyes
`session_name`yesyesyesyes
`session_regenerate_id`yesyesyesyes
`session_start`yesyesyesyes
`session_write_close`yesyesyesyes
`set_error_handler`yesyesyesyes
`set_exception_handler`yesyesyesyes
`setcookie`yesyesyesyes
`setrawcookie`yesyesyesyes
`settype`yesyesyesyes
`sha1`yesyesyesyes
`sha1_file`yesyesyesyes
`shell_exec`yesyesyesyes
`show_source`yesyesyesyes
`shuffle`yesyesyesyes
`similar_text`yesyesyesyes
`sin`yesyesyesyes
`sinh`yesyesyesyes
`sizeof`yesyesyesyes
`sleep`yesyesyesyes
`sort`yesyesyesyes
`soundex`yesyesyesyes
`spl_autoload_register`yesyesyesyes
`sprintf`yesyesyesyes
`sqrt`yesyesyesyes
`sscanf`yesyesyesyes
`stat`yesyesyesyes
`str_contains`yesyesyesyes
`str_decrement`yesyesyesyes
`str_ends_with`yesyesyesyes
`str_getcsv`yesyesyesyes
`str_increment`yesyesyesyes
`str_ireplace`yesyesyesyes
`str_pad`yesyesyesyes
`str_repeat`yesyesyesyes
`str_replace`yesyesyesyes
`str_rot13`yesyesyesyes
`str_shuffle`yesyesyesyes
`str_split`yesyesyesyes
`str_starts_with`yesyesyesyes
`str_word_count`yesyesyesyes
`strcasecmp`yesyesyesyes
`strchr`yesyesyesyes
`strcmp`yesyesyesyes
`strcspn`yesyesyesyes
`stream_context_create`yesyesyesyes
`stream_set_chunk_size`yesyesyesyes
`stream_set_read_buffer`yesyesyesyes
`stream_set_timeout`yesyesyesyes
`stream_set_write_buffer`yesyesyesyes
`strip_tags`yesyesyesyes
`stripcslashes`yesyesyesyes
`stripos`yesyesyesyes
`stripslashes`yesyesyesyes
`stristr`yesyesyesyes
`strlen`yesyesyesyes
`strnatcasecmp`yesyesyesyes
`strnatcmp`yesyesyesyes
`strncasecmp`yesyesyesyes
`strncmp`yesyesyesyes
`strpbrk`yesyesyesyes
`strpos`yesyesyesyes
`strrchr`yesyesyesyes
`strrev`yesyesyesyes
`strrpos`yesyesyesyes
`strspn`yesyesyesyes
`strstr`yesyesyesyes
`strtok`yesyesyesyes
`strtolower`yesyesyesyes
`strtoupper`yesyesyesyes
`strtr`yesyesyesyes
`strval`yesyesyesyes
`substr`yesyesyesyes
`substr_compare`yesyesyesyes
`substr_count`yesyesyesyes
`substr_replace`yesyesyesyes
`symlink`yesyesyesyes
`sys_get_temp_dir`yesyesyesyes
`sys_getloadavg`yesyesyesyes
`tan`yesyesyesyes
`tanh`yesyesyesyes
`tempnam`yesyesyesyes
`time`yesyesyesyes
`tmpfile`yesyesyesyes
`touch`yesyesyesyes
`trait_exists`yesyesyesyes
`trigger_error`yesyesyesyes
`trim`yesyesyesyes
`uasort`yesyesyesyes
`ucfirst`yesyesyesyes
`ucwords`yesyesyesyes
`uksort`yesyesyesyes
`umask`yesyesyesyes
`uniqid`yesyesyesyes
`unlink`yesyesyesyes
`unpack`yesyesyesyes
`unserialize`yesyesyesyes
`urldecode`yesyesyesyes
`urlencode`yesyesyesyes
`usleep`yesyesyesyes
`usort`yesyesyesyes
`utf8_decode`yesyesyesyes
`utf8_encode`yesyesyesyes
`var_dump`yesyesnono
`var_export`yesyesyesyes
`version_compare`yesyesyesyes
`vfprintf`yesyesyesyes
`vprintf`yesyesyesyes
`vsprintf`yesyesyesyes
`web_bool`yesyesyesyes
`web_int`yesyesyesyes
`web_string`yesyesyesyes
`wordwrap`yesyesyesyes

Self-host gaps · Development status · Regenerate: php script/generate-pages-capability-comparison.php