せのお (妹尾 賢) (senooken@social.senooken.jp)'s status on Saturday, 13-Jul-2019 01:37:32 JST
-
せのお (妹尾 賢) (senooken@social.senooken.jp)'s status on Saturday, 13-Jul-2019 01:37:32 JST せのお (妹尾 賢) バージョンが変わってエラーになった原因がわかりました。
PHP 7.2.0からそれまでE_NOTICE扱い (PHP標準では無視のレベル) だったのが,E_WARNINGにエラーレベルが格上げされたのが原因です。
https://www.php.net/manual/en/language.types.array.php#language.types.array.foo-bar
手っ取り早く,エラーを回避したいならば,以下のコードのように,error_reportingを修正してエラーレベルからE_WARNINGを除外すればOKです。ただし,E_WARNINGは警告なので,この対処方法はオススメしません。
<?php
error_reporting(E_ALL & ~E_NOTIVE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);
$arr = array("fruit" => "apple");
echo $arr[fruit] . "\n";
$foo[baa]がだめな理由は以下に詳しく書いてあります。
PHPでは,変数は$の前置が必須であり,それ以外は関数か定数のどちらかとみなされます。そのため,$foo[bar]は定数未定義のため,エラーとなるはずでした。しかし,配列のキーの場合,未定義定数の場合,昔のPHPは他にありえないので文字列だと解釈してくれていたようです。
https://www.php.net/manual/ja/language.types.array.php#language.types.array.foo-bar
どちらにしても,PHPの構文上,この記法はまずいので,リテラルの文字 (コード上に直接記す文字) は一重引用符 (') か二重引用符 (") で囲むことが必須です。
一括置換で直すのが後のためだと思います。
なお,PHPは今でも現代的なGoやRuby,node.jsと戦って勝負できるレベルの言語なので,PHPが古いなどの批判はあまり気にしなくてもいいと思いますよ。
参考: http://isucon.net/archives/52502356.html
PHPの新しい機能を使いこなして,古くて悪くなってしまったやりかたを変えればいいだけだと思います。
どうしても気になるならば,乗り換えればいいとは思いますが…。