man ページの 1 つによるとhttp://www.php.net/manual/en/language.oop5.static.php :
非静的メソッドを静的に呼び出すと、E_STRICT レベルの警告が生成されます。
ただし、クラス内から呼び出しが行われた場合はそうではないようです。
error_reporting(-1);
class Test {
private $id;
function __construct($id) { $this->id = $id; }
function id() { return $this->id; }
function __toString() {
return Test::id()
. self::id()
. static::id()
. static::id()
. call_user_func('Test::id')
. call_user_func(array('Test', 'id'));
}
}
$a = new Test('a');
$b = new Test('b');
echo "$a $b $a"; # aaaaaa bbbbbb aaaaaa
var_dump(error_get_last()); # NULL
PHP 5.4 でのテスト
デモ: http://codepad.viper-7.com/IKp9iX
私は実証したと信じています:
- E_STRICT 警告は生成されません
- そのphpは、静的メソッド呼び出しをインスタンスメソッド呼び出しに魔法のように修正します(インスタンス変数にアクセスすると、
id
これが証明されます)。
編集- debug_backtrace (->
) を __toString 呼び出しに挿入すると、「メソッド呼び出し」を意味するの呼び出し「タイプ」が生成される
ことを追加したいと思います。
これはバグですか、それとも文書化された機能ですか?