◆ 配列のキーに定数を書くと定数がなければその文字列として扱われる
◆ 変数展開のときは キーにクォーテーション入れなくても文字列扱いされる

$arr['index'] と書くと 連想配列から index という文字列をキーとする値を取り出しますよね

では

$arr[index] と書くとどうなるのか

普通に考えると [] の内側は式が来るところです
なので "" や '' で囲んでいない文字列じゃないものはこれないはずです

index と書くと index という変数になりそうです
ですが php の場合は変数には $ をつけないといけないので $ をつけなくて定数ということになります

index という定数が 3 という値なら $arr[3] と同じになると考えられます

ではやってみます
define('abc', 'xyz');

$arr = [
    'abc' => 'abc',
    'xyz' => 'xyz'
];

var_dump($arr[abc]);
// xyz
var_dump($arr['abc']);
// abc

var_dump("{$arr[abc]}");
// xyz
var_dump("{$arr['abc']}");
// abc

abc は定数で xyz という文字列にしているので abc のときは xyz になり 'abc' ときは abc になっています
変数展開のときでも一緒ですね

では変数展開時に {} をなしでやってみます
var_dump("$arr[abc]");
// abc


なぜ!?

abc なら定数で xyz として考えられるのかと思ったら abc は '' がないのに文字列として扱われています
PHP5 でも 7 でも変わらないので特にバグではなく仕様な模様

意味不明な挙動はいつものことなのでそれほど驚きませんが バグのもとですし 直感的でない仕様はやめるべきだと思うんですよね

とりあえず "" の変数展開で配列を使うときは絶対に {} で囲むようにすればいいと思います



そしてもうひとつ
こっちは 変数展開は関係ないです

定数を定義しないで定数として使います
abc のときは abc に xyz と定数を作っていましたが定数を作っていない xyz を書いてみます
xyz がないので 未定義警告が出て $arr[0] や $arr[null] のような動きになるのかなと思って実行します
var_dump($arr[xyz]);

// string(3) "xyz"
// PHP Notice:  Use of undefined constant xyz - assumed 'xyz'

どうしてこうなった

Notice が出ていて xyz って定数ないから 'xyz' って文字列にしといたわ とか言ってやがります

なに余計なことしてくれてるの
Notice があるから 開発中に見つけられて修正できるからいいものの 複雑な条件分岐でのみ起こる場合でテスト不足なら酷いバグになる予感しかしないですよ

これをみると JavaScript の未定義エラーで強制終了してくれるのはいいことだったんだと思います
そのまま動き続けられると原因が分かりづらいですし

それ以前に '' なしは書き忘れというれっきとしたバグですよ
バグは通知してエラーを起こしてくれるのが一番なのに勝手に 修正しといたから で進められても困るんです



まぁ 後の方は Notice 出るからいいのですが 前の方はなんなんでしょうね
真面目に何か作るときに PHP を使ってはいけない感がすごく伝わってきます