Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP 7.4: New RemovedCurlyBraceArrayAccess sniff #855

Merged
merged 1 commit into from
Aug 28, 2019

Conversation

jrfnl
Copy link
Member

@jrfnl jrfnl commented Jul 29, 2019

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

Refs:

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. See: #851, #852, #853

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:

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 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 and for the compared results, the outcome is 100% the same.

Related to #808

@jrfnl jrfnl added this to the 9.3.0 milestone Jul 29, 2019
@jrfnl jrfnl force-pushed the php-7.4/deprecated-curly-brace-syntax branch from 5eae43f to 23413d4 Compare August 21, 2019 09:52
> 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 force-pushed the php-7.4/deprecated-curly-brace-syntax branch from 23413d4 to e89af92 Compare August 28, 2019 14:32
@jrfnl jrfnl marked this pull request as ready for review August 28, 2019 14:33
@wimg wimg merged commit e0714d7 into master Aug 28, 2019
@delete-merged-branch delete-merged-branch bot deleted the php-7.4/deprecated-curly-brace-syntax branch August 28, 2019 14:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants