3v4l.org

run code in 300+ PHP versions simultaneously
<?php Tokens::polyfillTokenizerConstants(); Tokens::dumpMap(); Tokens::polyfillTokenizerConstants(); Tokens::dumpMap(); class Tokens { /** * Mapping table for polyfilled constants * * @var array<int, string> */ private static $polyfillMappingTable = []; public static function tokenName($token) { if (is_string($token) === true) { // PHPCS native token. return substr($token, 6); } return (self::$polyfillMappingTable[$token] ?? token_name($token)); } public static function dumpMap() { var_dump(self::$polyfillMappingTable); } /** * Polyfill tokenizer (T_*) constants. * * {@internal IMPORTANT: all PHP native polyfilled tokens MUST be added to the * `PHP_CodeSniffer\Tests\Core\Util\Tokens\TokenNameTest::dataPolyfilledPHPNativeTokens()` test method!} * * @return void */ public static function polyfillTokenizerConstants(): void { // Ideally this would be a private class constant. We cannot do that // here as the constants that we are polyfilling in this method are // used in some of the class constants for this class. If we reference // any class constants or properties before this method has fully run, // PHP will intitialise the class, leading to warnings about undefined // T_* constants. $tokensToPolyfill = [ 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'T_ATTRIBUTE', 'T_BAD_CHARACTER', 'T_COALESCE_EQUAL', 'T_ENUM', 'T_FN', 'T_MATCH', 'T_NAME_FULLY_QUALIFIED', 'T_NAME_QUALIFIED', 'T_NAME_RELATIVE', 'T_NULLSAFE_OBJECT_OPERATOR', 'T_PRIVATE_SET', 'T_PROTECTED_SET', 'T_PUBLIC_SET', 'T_READONLY', ]; // <https://www.php.net/manual/en/tokens.php> // The PHP manual suggests "using big numbers like 10000" for // polyfilled T_* constants. We have arbitrarily chosen to start our // numbering scheme from 135_000. $nextTokenNumber = 135000; $polyfillMappingTable = []; foreach ($tokensToPolyfill as $tokenName) { if (defined($tokenName) === false) { while (isset($polyfillMappingTable[$nextTokenNumber]) === true) { $nextTokenNumber++; } define($tokenName, $nextTokenNumber); } $polyfillMappingTable[constant($tokenName)] = $tokenName; } // Be careful to not reference this class anywhere in this method until // *after* all constants have been polyfilled. self::$polyfillMappingTable = $polyfillMappingTable; } }
Output for git.master_jit, git.master
array(16) { [288]=> string(37) "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG" [287]=> string(41) "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG" [392]=> string(11) "T_ATTRIBUTE" [411]=> string(15) "T_BAD_CHARACTER" [283]=> string(16) "T_COALESCE_EQUAL" [376]=> string(6) "T_ENUM" [349]=> string(4) "T_FN" [344]=> string(7) "T_MATCH" [315]=> string(22) "T_NAME_FULLY_QUALIFIED" [317]=> string(16) "T_NAME_QUALIFIED" [316]=> string(15) "T_NAME_RELATIVE" [397]=> string(26) "T_NULLSAFE_OBJECT_OPERATOR" [364]=> string(13) "T_PRIVATE_SET" [365]=> string(15) "T_PROTECTED_SET" [366]=> string(12) "T_PUBLIC_SET" [367]=> string(10) "T_READONLY" } array(16) { [288]=> string(37) "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG" [287]=> string(41) "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG" [392]=> string(11) "T_ATTRIBUTE" [411]=> string(15) "T_BAD_CHARACTER" [283]=> string(16) "T_COALESCE_EQUAL" [376]=> string(6) "T_ENUM" [349]=> string(4) "T_FN" [344]=> string(7) "T_MATCH" [315]=> string(22) "T_NAME_FULLY_QUALIFIED" [317]=> string(16) "T_NAME_QUALIFIED" [316]=> string(15) "T_NAME_RELATIVE" [397]=> string(26) "T_NULLSAFE_OBJECT_OPERATOR" [364]=> string(13) "T_PRIVATE_SET" [365]=> string(15) "T_PROTECTED_SET" [366]=> string(12) "T_PUBLIC_SET" [367]=> string(10) "T_READONLY" }
Output for rfc.property-hooks
array(16) { [288]=> string(37) "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG" [287]=> string(41) "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG" [389]=> string(11) "T_ATTRIBUTE" [407]=> string(15) "T_BAD_CHARACTER" [283]=> string(16) "T_COALESCE_EQUAL" [373]=> string(6) "T_ENUM" [349]=> string(4) "T_FN" [344]=> string(7) "T_MATCH" [314]=> string(22) "T_NAME_FULLY_QUALIFIED" [316]=> string(16) "T_NAME_QUALIFIED" [315]=> string(15) "T_NAME_RELATIVE" [393]=> string(26) "T_NULLSAFE_OBJECT_OPERATOR" [135000]=> string(13) "T_PRIVATE_SET" [135001]=> string(15) "T_PROTECTED_SET" [135002]=> string(12) "T_PUBLIC_SET" [364]=> string(10) "T_READONLY" } array(16) { [288]=> string(37) "T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG" [287]=> string(41) "T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG" [389]=> string(11) "T_ATTRIBUTE" [407]=> string(15) "T_BAD_CHARACTER" [283]=> string(16) "T_COALESCE_EQUAL" [373]=> string(6) "T_ENUM" [349]=> string(4) "T_FN" [344]=> string(7) "T_MATCH" [314]=> string(22) "T_NAME_FULLY_QUALIFIED" [316]=> string(16) "T_NAME_QUALIFIED" [315]=> string(15) "T_NAME_RELATIVE" [393]=> string(26) "T_NULLSAFE_OBJECT_OPERATOR" [135000]=> string(13) "T_PRIVATE_SET" [135001]=> string(15) "T_PROTECTED_SET" [135002]=> string(12) "T_PUBLIC_SET" [364]=> string(10) "T_READONLY" }

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
51.39 ms | 412 KiB | 5 Q