PHPのエラー『Notice: Non-static Method Should be Called Statically』の解決方法

  • 作成日 2025.03.13
  • php
PHPのエラー『Notice: Non-static Method Should be Called Statically』の解決方法

「Notice: Non-static Method Should be Called Statically」は、静的でないメソッドを静的に呼び出したときに発生するエラー。PHPのクラス設計に関わるエラーであり、正しいオブジェクトの利用方法を理解する必要がある。発生条件と解決策を詳しく説明する。

1. エラーの発生条件

このエラーは、以下のような場合に発生する。

  • インスタンスメソッド(非静的メソッド)を `ClassName::methodName()` のように静的に呼び出した場合
  • メソッドが `static` で定義されていないのに、`self::methodName()` または `ClassName::methodName()` で呼び出した場合
  • オブジェクトを生成せずに非静的メソッドへアクセスした場合

2. エラーが発生するコード例

以下のコードでは、`greet()` は非静的メソッドだが、クラス名で直接呼び出しているためエラーが発生する。

<?php
class Example {
    public function greet() {
        return "Hello, World!";
    }
}

echo Example::greet(); // Notice: Non-static Method Should be Called Statically
?>

実行すると、次のようなエラーメッセージが表示される。

Notice: Non-static method Example::greet() should not be called statically in /path/to/script.php on line 8

3. 解決策1: オブジェクトを生成してメソッドを呼び出す

非静的メソッドは、オブジェクトを作成してから呼び出す。

<?php
class Example {
    public function greet() {
        return "Hello, World!";
    }
}

$example = new Example();
echo $example->greet(); // Hello, World!
?>

4. 解決策2: メソッドを `static` にする

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

<?php
class Example {
    public static function greet() {
        return "Hello, World!";
    }
}

echo Example::greet(); // Hello, World!
?>

5. 解決策3: `self::` ではなく `$this->` を使う

非静的メソッド内で `self::` を使用するとエラーになるため、`$this->` を使う。

<?php
class Example {
    public function greet() {
        return $this->message();
    }

    private function message() {
        return "Hello!";
    }
}

$example = new Example();
echo $example->greet(); // Hello!
?>

6. 解決策4: `static` メソッドと非静的メソッドの違いを理解する

クラス設計の段階で、静的メソッドと非静的メソッドを適切に分ける。

<?php
class Example {
    public static function staticMethod() {
        return "This is a static method.";
    }

    public function nonStaticMethod() {
        return "This is a non-static method.";
    }
}

// 静的メソッドの呼び出し
echo Example::staticMethod(); // OK

// 非静的メソッドの呼び出し
$example = new Example();
echo $example->nonStaticMethod(); // OK
?>

7. 解決策5: `static` メソッド内で `self::` を使う

静的メソッド内でインスタンスメソッドを直接呼び出すとエラーになるため、`self::` を使用する。

<?php
class Example {
    public static function greet() {
        return self::message();
    }

    private static function message() {
        return "Hello!";
    }
}

echo Example::greet(); // Hello!
?>

8. 解決策6: `new self()` でインスタンスを作成する

静的メソッド内で非静的メソッドを呼び出したい場合、`new self()` を使う。

<?php
class Example {
    public function greet() {
        return "Hello, World!";
    }

    public static function createInstance() {
        return (new self())->greet();
    }
}

echo Example::createInstance(); // Hello, World!
?>

9. 解決策7: `late static binding` を使用する

子クラスでオーバーライドできる静的メソッドを作成する場合、`static::` を使用する。

<?php
class ParentClass {
    public static function getClassName() {
        return static::class;
    }
}

class ChildClass extends ParentClass {}

echo ChildClass::getClassName(); // ChildClass
?>

10. 解決策8: `call_user_func()` を使う

動的にメソッドを呼び出す場合、`call_user_func()` を使用する。

<?php
class Example {
    public function greet() {
        return "Hello, World!";
    }
}

$example = new Example();
echo call_user_func([$example, "greet"]); // Hello, World!
?>