【PHP7.4】波括弧による文字列|配列アクセスが削除される

[大改修が入ることはないでしょう](https://qiita.com/rana_kualu/items/993fff9662726a004660)と言ったな、あれは嘘だ。
2019/07/22の[仕様凍結](https://wiki.php.net/todo/php74)を目前に、いくつかのRFCが駆け足で投票に入っています。
そのうちのひとつで、あらゆるPHPプログラムに影響する可能性のある変更が入りました。

[Deprecate curly brace syntax for accessing array elements and string offsets](https://wiki.php.net/rfc/deprecate_curly_braces_array_access)というRFCが投票中です。
2019/07/03投票開始、2019/07/17投票終了、受理には2/3+1の賛成が必要です。
2019/07/08時点では賛成23反対6で、おそらく受理されます。


# Deprecate curly brace syntax for accessing array elements and string offsets

## Introduction

PHPは、配列要素と文字列オフセットへのアクセスに、角括弧と波括弧の両方を使用することができます。

```php
	$array = [1, 2];
	echo $array[1]; // 2
	echo $array{1}; // こっちも2
	 
	$string = "foo";
	echo $string[0]; // "f"
	echo $string{0}; // こっちも"f"
```

しかし、これら両方の構文のサポートは、混乱をもたらす可能性があります。
波括弧構文は角括弧構文と同じ動作ですか？
パフォーマンスに違いはありますか？
波括弧はスコープを分ける標準的な方法ですが、波括弧構文にもスコープを切る機能はありますか？
そもそも波括弧構文はどうして存在しているのですか？

マニュアルに[ほんの少し](https://www.php.net/manual/ja/language.types.array.php#language.types.array.syntax.accessing)[ある注釈](https://www.php.net/manual/ja/language.types.string.php#language.types.string.substr)を除いて、波括弧構文はほぼ文書化されていません。
さらに、通常の角括弧構文より機能は少なくなっています。
たとえば配列への要素の追加に波括弧を使うことはできません。

```php
$array[] = 3;
echo $array[2]; // 3

$array{} = 3; // Parse error: syntax error, unexpected '}'
```

配列の作成もできません。

```php
$array = [1, 2]; // OK

$array = {1, 2}; // Parse error: syntax error, unexpected '{'
```

[list短縮構文](https://qiita.com/rana_kualu/items/572494021917fbb93c95#square-bracket-syntax-for-array-destructuring-assignment)にも使えません。

```php
[$one, $two] = $array; // OK

{$one, $two} = $array; // Parse error: syntax error, unexpected ','
```


## Proposal

波括弧構文による配列と文字列オフセットへのアクセスを非推奨にします。

```php:PHP7.4
$arr = [1, 2, 3];
var_dump($arr{1}); // Warning: Array and string offset access syntax with curly braces is deprecated
```


## Discussion

### Wasn't the curly brace syntax deprecated once before?

波括弧構文、前いちどDeprecatedにならなかったっけ？

[2008年6月の議論](https://externals.io/message/38153)によると、波括弧構文はPHP5.1のRC5時点では非推奨でしたが、最終リリース前に非推奨警告は削除されました。
2006年8月のPHPマニュアルには「PHP6以降廃止予定」と書かれていましたが、PHP6はなくなったのでリリースされることはありませんでした。


### Is the curly brace syntax valuable for differentiating string and array offset access?

波括弧構文は、文字列アクセスと配列オフセットアクセスを区別するのに役立たないかな？

重複した構文があれば、文字列アクセスと配列オフセットアクセスを区別することができます。
問題は言語によって使い分けが強制されず、どちらの構文も文字列と配列の両方に使用できることです。
その結果、あるコードベースでは文字列アクセスに常に`$str[0]`、配列アクセスに常に`$arr{0}`を使うようにすることはできますが、他のコードベースでは逆の規則になっているかもしれません。


### How frequently is the curly brace syntax used?

波括弧構文はどれだけ使われている？

Composerパッケージのトップ2000ライブラリについてNikitaが調べたところ、2.2k箇所で使用され、これは全ての配列アクセス888.3kのうち0.25%でした。
しかし、これは調査したパッケージが重複しているため、実体より多少多く出ています。
たとえばWordPressコアリポジトリのコピーが二つあり、それぞれが182箇所で使用しています。
使用された波括弧の92%は、トップ2000のうちわずか25リポジトリに集中していました。


### Will it be too much work for people to migrate code away from the curly brace syntax?

移行は大変？

パッチと一緒に[移行スクリプト](https://github.com/rjhdby/php-src/blob/deprecate_alternate_array_access/convert_array_access_braces.php)が公開されています。


## Backward Incompatible Changes

文字列・配列に波括弧構文でアクセスすると非推奨の警告が発生するようになります。


## Future Scope

PHP8もしくはその後のどこかで、波括弧構文を完全に削除します。
それ以降、波括弧構文はコンパイルエラーになります。


## References

・現行スレッド：https://externals.io/message/104744
・2008年6月の議論スレッド：https://externals.io/message/38153
・2005年11月の議論スレッド：https://externals.io/message/20143


# 感想

消したいという話は14年も前から出ていたようですが、最近のPHP構文刷新の流れに乗ってついに可決されます。
色々なライブラリを見てきましたがこの書き方を見たことないですし、そもそもこの構文を知らない人も多いかもしれません。
なくなっても問題ないですね。

むしろ何故存在していたのかがわからない。

このRFCでは今後の予定は決まっておらず、後の人に任された状態になっています。
素直にPHP8以降で削除されればいいのですが、このまま宙ぶらりんになると困っちゃいますね。