30
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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本体のアプデは待った方がよいでしょう。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
30
Help us understand the problem. What are the problem?