PHPのインスタンスメソッドとスタティックメソッド

公開日: : 最終更新日:2019/08/15 php, オブジェクト指向

クラスにはnewしてインスタンス(複製)した後に使用するインスタンスメソッドと
静的に利用できるスタティックメソッドがあります。
この2つのメソッドの動作の違いをブログにまとめます。

インスタンスメソッドとスタティックメソッド

class A
{
    const ATENA = '様';
    public static function foo()
    {
        return "hogehoge\n";
    }
    public static function bar($name)
    {
        return $name . "\n";
    }

    public static function huga($name)
    {
        return $name . self::ATENA . "\n";
    }

}
$a = new A();
echo $a->foo(); //「米澤」と表示される
echo A::foo(); //「米澤」と表示される
echo A::bar('平原'); //「平原」と表示される
echo A::huga('平原'); //「平原様」と表示される

スタティックとして宣言したメソッドでもインスタンスメソッドとして呼び出すことが出来ます。
スタティックメソッド内で他のプロパティやメソッドを呼び出すときは「self」で呼び出すことが出来ます。
(「self」以外にも自分自身のクラス名「A」で呼び出すことも出来ます。どっちが良いかは知りません。。。)
また、PHP5.4以上はスタティックとして宣言しないと「::」で呼び出した時にエラーになります。

class A
{
    public function bar($name)
    {
        return $name . "\n";
    }
}
echo A::bar('平原'); // php5.4ではエラーになる

スタティックメソッドとして動くのはどれだ?

class A
{
    public $hoge = '米澤';
    public static $fuga = '米澤';
    const  HOGE  = '米澤';
    public static function bar1()
    {
        return $this->hoge . "\n";
    }
    public static function bar2()
    {
        return self::HOGE . "\n";
    }
    public static function bar3()
    {
        return self::hoge . "\n";
    }
    public static function bar4()
    {
        return self::bar2() . "\n";
    }
    public static function bar5()
    {
        return self::fuga . "\n";
    }
}
echo A::bar1(); // 動きません
echo A::bar2(); // 動きます
echo A::bar3(); // php5.4以上ではエラーが出ます
echo A::bar4(); // 動きます
echo A::bar5(); // 動きます

bar1()は内部で$thisが呼び出されていますが、$thisはインスタンスを作った時しか使えません。
スタティックなメソッドを作る際は、クラス内のメソッドは全てスタティックメソッドで作ったほういいです。

スタティックメソッド応用編

スタティックで宣言されていないプロパティを呼び出したい時があるでしょう。
その時はメソッド内部でインスタンスを作成します。

class A
{
    public $hoge = '横山';
    public static function bar1()
    {
        $instance = new A();
        return $instance->hoge . "\n";
    }
}
echo A::bar1();

良く使われる手法です。
もうちょっと改良すればシングルトンデザインパターンとかに発展できますし、
他のクラスを呼び出すときにも使えます。

スタティックメソッドは__constructが呼ばれるのか?

__constructはインスタンスを作成した時しか呼ばれません。
スタティックなクラスを作成する場合に__constructを書いているとバカにされます。

class A
{
    public function __construct()
    {
        return "fugafuga\n";
    }

    public static function bar1()
    {
        return "hogehoge\n";
    }
}
echo A::bar1(); //__constructは呼ばれない。

まとめ

かなり初心者向けの内容です。
こんなのだれでも知っているよと思いますが、意外と知らない人が多いです。

良く、どれをインスタンスメソッドにし、どれをスタティックメソッドにすればいいか悩みますが、自分なりの答えとしては、、、

  • クラスに依存しない汎用的に使えるメソッドはスタティックメソッド
  • それ以外のメソッドはインスタンスメソッド

オブジェクト指向に従うのであれば、ほとんどインスタンスメソッドになるはずです。
しかし、まったく他のクラスに依存しない(継承とか行わない)メソッドが出てくると思います。
例えば、文字列をカットする。単純な計算などなど、、、
そういったものは、どのクラスでも使用する可能性があります。
迷わず、スタティックメソッドにしたほうが良いです。
わざわざインスタンスも作る必要もありませんので、処理も早くなるはずです。

関連記事

記事はありませんでした

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

PAGE TOP ↑