役立つ情報
登録日: 2025-02-02   最終更新日: 2025-03-19

Laravel cannot be called statically 解決方法

Laravelで "Cannot be called statically" というエラーが発生する原因と解決方法を説明します。

エラーの原因

このエラーは、インスタンスメソッドを静的(static)に呼び出した 場合に発生します。 Laravelのモデルやクラスのメソッドを Class::method() のように呼び出した際、そのメソッドが static で定義されていないとエラーになります。

解決方法

① メソッドをインスタンス経由で呼び出す

(誤) 静的に呼び出している


use App\Models\User;

$name = User::getName(); // エラー発生

(正) インスタンスを作成して呼び出す


$user = User::find(1); // IDが1のユーザー取得
$name = $user->getName(); // 正しく動作

② メソッドを static にする

メソッドを静的に使いたい場合は、 static を追加する。

(誤) 非静的メソッドを静的に呼び出す


class User {
    public function getName() {
        return "John Doe";
    }
}

echo User::getName(); // エラー

(正) メソッドを static にする


class User {
    public static function getName() {
        return "John Doe";
    }
}

echo User::getName(); // 正しく動作

③ Laravelのモデルで static メソッドを使う

Eloquentモデルでは static メソッドとインスタンスメソッドを使い分ける。

(誤) インスタンスメソッドを静的に呼ぶ


use App\Models\User;

$users = User::getAllUsers(); // エラー発生

(正) 静的メソッドにする


use App\Models\User;

class User extends Model {
    public static function getAllUsers() {
        return self::all();
    }
}

$users = User::getAllUsers(); // 正しく動作

④ Facades を使用する

Laravelの ファサード (Facades) を使う場合、クラスのメソッドが static でないとエラーになる。 例えば、以下のようなカスタムクラスを static にすれば、ファサードとして利用できる。

(誤) ファサードで static なし


namespace App\Helpers;

class MyHelper {
    public function sayHello() {
        return "Hello, Laravel!";
    }
}

use App\Helpers\MyHelper;

echo MyHelper::sayHello(); // エラー

(正) static を追加


namespace App\Helpers;

class MyHelper {
    public static function sayHello() {
        return "Hello, Laravel!";
    }
}

use App\Helpers\MyHelper;

echo MyHelper::sayHello(); // 正しく動作

Copyright 役立つ情報.net