PHP7

今日はPHPネタです。

あるシステム開発を行っていたら

Array and string offset access syntax with curly braces is deprecated at (PHPのフルパス)

というようなエラーメッセージが出てきたのでその対処した経緯を明記しておきます。同じようなトラブルで「?」となった人に参考になれば幸いです。

上記のエラーメッセージですが英文だとよくわからないのでGoogle先生に翻訳してもらうと下記の様な意味になります。

波括弧を使用した配列と文字列のオフセットアクセス構文は非推奨になりました

これを見て「ん?どういうこと?」と思い、該当するプログラムを確認します。

$number = 1;
$hoge = $fuge->soge_{$number};

といったようなプログラムです。soge_{$number}は可変変数を使用してプロパティを設定。つまり、上記プログラムは

$hoge = $fuge->soge_1;

と同じ意味と考えていました。すると上記エラーが発生。早々にGoogle先生に聞いてみました。すると下記ページを教えてくれました。

PHP: PHP 7.4.x で推奨されなくなる機能 – Manual

これによるとPHP 7.4から変わったようで$var{$idx}から$var[$idx]に変更しろとのこと。「ほう、そうか!」 ということで下記の様に変更。

$number = 1;
$hoge = $fuge->soge_[$number];

するとエラーが出なくなって満足・・・か?カギ括弧に変えたのはいいけど、これって$fuge->soge_の配列では?自分は配列ではなく可変変数として使いたい。では、可変変数は使えないのか?というとそうでもないらしく可変変数についてのドキュメントは下記の様に残っています。

PHP: 可変変数 – Manual

上記のリンクページを眺めていると

警告 可変プロパティが配列である場合の解決方法が、PHP 5 と PHP 7 では異なります。 PHP 7.0 移行ガイド に、変更点の詳細をまとめました。また、波括弧を使って曖昧さを除去する方法も示します。

早々に見てみるとやっぱり配列という認識になっている様子。さて、どうしたものか?と、考えた結果、下記の様に書くことでOKでした。

$number = 1;
$soge_num = 'soge_'.$number;
$hoge = $fuge->{$soge_num};

もっとシンプルに書く方法もあるかと思いますが、その辺は置いておいて。

今回初めて知ったのは

  • 配列にカギ括弧ではなく波括弧も使えていたこと
  • 7.4から配列で波括弧は使えなくなったこと

今回はいろいろと知ることができました。