13
4

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 5 years have passed since last update.

[PHP]関数呼出し引数末尾にカンマを付ける際は気をつけるべし

Last updated at Posted at 2019-06-10

デバッグメモです。
レアケースかもですが、同じようなエラーに悩む方に届きますように…!

Laravelにて新規フォームを作成中

「よし!ローカル環境実装できた!開発環境に上げて確認するぞ~」

「・・・あれ???」

1. 開発環境でエラー発生・・・

フォームテストでエラーになってしまいました。
ログも出ない!なんてこともたまにあるのですが今回は幸いにもエラーログを吐いていたので、
出力されたログを確認すると下記のようなエラーが・・・

laravel-2019-06-03.log
[2019-06-03 19:02:49] development.ERROR: Class App\Http\Requests\HogeHogePost does not exist {"exception":"[object] (ReflectionException(code: 0): Class App\\Http\\Requests\\HogeHogePost does not exist at /xxx/hogehoge.jp/vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php:25, ParseError(code: 0): syntax error, unexpected ')' at /xxx/hogehoge.jp/app/Http/Requests/HogeHogePost.php:37)

「どうやらHogeHogePostクラスが見つからないよ~」と言われているようです。
クラスが見つからないということなので真っ先にvendor/composer/autoload_classmap.phpファイルの不備を疑い、下記コマンドを叩いてみましたが、結果は変わりませんでした。

composer dump-autoload

Laravelで新たに名前空間を追加した際は、ここにクラスあるよ!という情報をクラスマップに定義してあげる必要があります。
ですがvendor/composer/フォルダやcomposer.jsonファイルの差分を見て差異がないところを見ると、composerは今回関係ないかもしれない。。。

2. クラスマップの問題ではないとすると、問題はソースの方???

一旦頭を切り替え、ログに「syntax error, unexpected ')' ~app/Http/Requests/HogeHogePost.php:37 (37行目に構文エラーあるぞ~)」とあったので改めてapp\Http\Requests\HogeHogePost.phpを見てみることにしました。
すると

app\Http\Requests\HogeHogePost.php
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return array_merge(
            $this->nameKanaRules(),
            $this->devidedPhoneNumRules(),
            $this->phoneNumRules(),
            $this->appointTimeRules(),   //カンマ!!!!
        );                               //37行目
    }

これかあああああああ

はい、関数呼出し引数の末尾にカンマをつけてしまっていたのが原因ですね

なぜローカル環境ではエラーが出なかったかというとローカル環境と開発環境のPHPバージョンに差異があり、その間に引数末尾のカンマを許容する新機能が追加されたことが原因でした。
(ローカル環境:PHP 7.3.2, 開発環境:PHP 7.2.13)

下記PHP公式のリリースノートです。
https://wiki.php.net/rfc/trailing-comma-function-calls

配列を扱うときの癖で末尾にカンマをつけてしまっていましたが、引数末尾にもカンマを付けられるようになったのは最近だったようです。
PHP歴が浅いこともあり全く気がつきませんでした。

末尾のカンマを取り、無事エラーは発生しなくなりました。(いや〜、本番環境じゃなくてよかった。。。)

app\Http\Requests\HogeHogePost.php
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return array_merge(
            $this->nameKanaRules(),
            $this->devidedPhoneNumRules(),
            $this->phoneNumRules(),
            $this->appointTimeRules()   //エラー解消
        );
    }

3. まとめ

これまで環境の違いによるエラーに出会うときはほとんどgit管理されていないファイルが原因で起きていたのですが、今回のようにファイルは同一であっても言語のバージョンが異なることでエラーが発生してしまうこともあります。

念のためPHPのリリースノートを一通りチェックしておこうと思います。

13
4
2

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
13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?