Copy the migrator.php
file to the root of your project and run the following command:
for file in **/*.php; do php ./migrator.php "$file"; done
BACK UP YOUR REPOSITORY BEFORE RUNNING THIS SCRIPT!
<?php | |
if ($argc !== 2) { | |
fwrite(STDERR, "Missing input script\n"); | |
die(1); | |
} | |
$fileName = $argv[1]; | |
$fileContent = file_get_contents($fileName); | |
$phpBinary = PHP_BINARY; | |
exec("$phpBinary -l $fileName", $output, $status); | |
if ($status !== 0) { | |
die($status); | |
} | |
$tokens = \PhpToken::tokenize($fileContent); | |
$nestingStack = []; | |
foreach ($tokens as $i => $token) { | |
$nextToken = $tokens[$i + 1] ?? null; | |
if ($token->id === T_DOLLAR_OPEN_CURLY_BRACES) { | |
if ($nextToken?->id === T_STRING_VARNAME) { | |
// Option 3 | |
$tokens[$i] = new \PhpToken(T_CURLY_OPEN, '{'); | |
$tokens[$i + 1] = new \PhpToken(T_VARIABLE, "\$$nextToken->text"); | |
} else { | |
// Option 4 | |
$token->text = '{${'; | |
$nestingStack[] = 0; | |
} | |
} | |
if ($token->text === '{' && !empty($nestingStack)) { | |
++$nestingStack[array_key_last($nestingStack)]; | |
} | |
if ($token->text === '}' && !empty($nestingStack)) { | |
$nesting = $nestingStack[array_key_last($nestingStack)]; | |
if ($nesting === 0) { | |
$token->text = '}}'; | |
array_pop($nestingStack); | |
} else { | |
--$nestingStack[array_key_last($nestingStack)]; | |
} | |
} | |
} | |
$result = join('', array_map(fn ($t) => $t->text, $tokens)); | |
file_put_contents($fileName, $result); |
<?php | |
// Simple | |
"$foo"; | |
"{$foo}"; | |
"${foo}"; | |
// DIM | |
"$foo[bar]"; | |
"{$foo['bar']}"; | |
"${foo['bar']}"; | |
// Property | |
"$foo->bar"; | |
"{$foo->bar}"; | |
// Method | |
"{$foo->bar()}"; | |
// Closure | |
"{$foo()}"; | |
// Chain | |
"{$foo['bar']->baz()()}"; | |
// Variable variables | |
"${$bar}"; | |
"${(foo)}"; | |
"${foo->bar}"; | |
// Nested | |
"${foo["${bar}"]}"; | |
"${foo["${bar['baz']}"]}"; | |
"${foo->{$baz}}"; | |
"${foo->{${'a'}}}"; | |
"${foo->{"${'a'}"}}"; |