登録日:
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(); // 正しく動作