63
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel5.8】PHP7.4でTrying to access array offset on valueが山盛り出るようになった

Last updated at Posted at 2019-11-28

Laravel5.8で試したからLaravel5.8としているだけで、他のバージョンや、あるいは他のフレームワークでも発生すると思います。

PHP7.4.0がリリースされました

で、PHP7.4からスカラー型変数に配列アクセスするとE_NOTICEが出るようになりました。

$a = null;
echo $a[1];

これはPHP7.3までは何も言いませんでしたが、7.4ではE_NOTICEが発生します。
さらにPHP8ではE_WARNINGになる予定です。

これの何が問題って、値が入ってるかどうかわからないテーブルにリレーション張ってる場合ですよ。

テーブルAのモデル
class TableA extends Model{
    /**
     * テーブルBへのリレーション
     */
    public function TableB()
    {
        return $this->belongsTo(\path\to\TableB::class, 'b_id', 'id');
    }
}

コントローラはwithで引っ張ってきてbladeに投げるだけ。

コントローラ
    $tableAs = TableA::with(['TableB'])->get();
    return view('hoge.blade.php', [$tableAs]);

ビューではなんか適当に表示。

hoge.blade.php
@foreach ($tableAs as $tableA)
	ID: {{ $tableA->id }}
	Bの値: {{ $tableA->TableB['name'] }}
@endforeach

テンプレートはだいたいこんな書き方をしてると思うのですが、というか私がしてるのですが、テーブルBに値が無かった場合、これまで"Bの値"は単に空白になっていました。
PHP7.4に上げた瞬間、至る所でLaravelがErrorExceptionを吐くようになってえらいことになりましたよ。

根本的に正しく解決するにはどうすればいいのかはよくわかりませんが、とりあえず

	Bの値: {{ $tableA->TableB['name'] ?? '' }}

ってすることで事なきを得た。

事なきを得たと思ったんですが、実はこれLaravel本体側でも発生するんですよね。
確認したところではemailバリデータを使うと出てきます。
そのうち修正されるとは思いますが、先にLaravelのアップデートを終わらせるまでPHP本体のアプデは待った方がよいでしょう。

63
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?