PHP 7.4: New RemovedCurlyBraceArrayAccess sniff by jrfnl · Pull Request #855 · PHPCompatibility/PHPCompatibility

@jrfnl jrfnl mentioned this pull request

Jul 29, 2019

40 tasks

wimg

wimg

@jrfnl

> The array and string offset access syntax using curly braces is deprecated.
> Use $str[$idx] instead of $str{$idx}.

Refs:
* https://wiki.php.net/rfc/deprecate_curly_braces_array_access
* https://github.com/php/php-src/blob/ef165b4422f4cef60f963833dddffa26fe1b2759/UPGRADING#L351-L353
* php/php-src#4416
* php/php-src@d574df6

## Implementation notes

Based on a lot of testing, I have come to the conclusion that the curly braces for array access worked in quite a lot of cases, though mostly since PHP 7.0.

The other sniffs which should take curly brace access into account - `NewArrayStringDereferencing`, `NewClassMemberAccess` and `NewFunctionArrayDereferencing` - have been adjusted in separate PRs.

This PR can only be merged after those PRs have been merged as it re-uses logic from those sniffs.

### Other tests

Based on the above mentioned tests, I also found that - yes, curly brace array access is supported on constants, but only when the first set of braces is square brackets.
See:
* https://3v4l.org/WIUHk
* https://3v4l.org/OWSq6
* https://3v4l.org/e6YWk

## Auto-fixing

In contrast to any other PHPCompatibility sniff, this sniff contains an auto-fixer.

For larger codebases, this issue can be quite time-consuming to fix, while fixing this automatically is trivial.

This also makes this sniff a fully fledged alternative to the [migration script](https://gist.github.com/theodorejb/763b83a43522b0fc1755a537663b1863) provided by PHP itself.

**Important**: At this moment, the PHPCompatibility unit test suite does not contain a mechanism to test the fixer.
A typical `.fixed` file which would be expected by the PHPCS native test suite to verify the fixer results _is_ included with this PR though.

## Tests run

I have run the sniff, as well as the fixer, over a number of medium to large codebases and have found _no_ false positives.

I have compared the results of a few of these projects with [the list compiled by Nikita](https://gist.github.com/nikic/b5f811e0423bf051f4492cd6e0c0273e) and for the compared results, the outcome is 100% the same.

@jrfnl jrfnl marked this pull request as ready for review

August 28, 2019 14:33

wimg

wimg approved these changes Aug 28, 2019