これ「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() は静的束縛遅延したいときだけ使います(特に理由はありません)。