LoginSignup
68
75

More than 5 years have passed since last update.

インスタンスメソッドから静的メソッドを呼ぶ方法の違い

Last updated at Posted at 2012-12-26

これ「staticメソッドは$this->でも呼べる」を見て、インスタンスメソッドからの静的メソッド呼び出しで self, static, \$this::, \$this-> がそれぞれどのように動作するか気になったので調べたメモ。

PHP のバージョンは手元にあった 5.4.6 です。

<?php
class A
{
    public static function public_static($name)
    {
        var_dump("$name " . __METHOD__);
    }

    private static function private_static($name)
    {
        var_dump("$name " . __METHOD__);
    }

    public function test()
    {
        self::public_static('self');
        self::private_static('self');

        static::public_static('static');
        //static::private_static('static'); // Fatal error: Call to private method B::private_static() from context 'A'

        $this::public_static('$this::');
        //$this::private_static('$this::'); // Fatal error: Call to private method B::private_static() from context 'A'

        $this->public_static('$this->');
        $this->private_static('$this->');
    }
}

class B extends A
{
    public static function public_static($name)
    {
        var_dump("$name " . __METHOD__);
    }

    private static function private_static($name)
    {
        var_dump("$name " . __METHOD__);
    }
}

$b = new B;
$b->test();

結果

string(21) "self A::public_static"
string(22) "self A::private_static"
string(23) "static B::public_static"
string(24) "$this:: B::public_static"
string(24) "$this-> B::public_static"
string(25) "$this-> A::private_static"

コメントアウトの部分をコメントインすると Fatal error です。

self::

クラス A のコンテキストで A のメソッドが呼ばれる。
A::method() と呼び出しているのと等価。

static:: と $this::

クラス A のコンテキストで B のメソッドが呼ばれる。
B::method() と呼び出しているのと等価。

$this->

クラス A のコンテキストで可視なメソッドが呼ばれる。


$this-> で静的メソッドを呼ぶとインスタンスメソッドのように可視性によって呼び先が変わるようです。

追記

ちなみに私は特別な理由がない限り self::hoge() です。static:hoge() は静的束縛遅延したいときだけ使います(特に理由はありません)。

68
75
1

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
68
75