确定静态方法是静态调用还是作为实例方法调用

时间:2011-03-30 08:59:53

标签: php static

在PHP中,静态方法可以像实例方法一样被调用:

class A {
    public static function b() {
        echo "foo";
    }
}

$a = new A;

A::b();  //foo
$a->b(); //foo

有没有办法确定b()内部是否静态调用该方法?

我已尝试isset($this)但在两种情况下都返回false,而debug_backtrace()似乎表明这两个调用实际上都是静态调用

array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(57) "test.php"
    ["line"]=>
    int(23)
    ["function"]=>
    string(1) "b"
    ["class"]=>
    string(1) "A"
    ["type"]=>
    string(2) "::"
    ["args"]=>
    array(0) {
    }
  }
}
Foo
array(1) {
  [0]=>
  array(6) {
    ["file"]=>
    string(57) "test.php"
    ["line"]=>
    int(24)
    ["function"]=>
    string(1) "b"
    ["class"]=>
    string(1) "A"
    ["type"]=>
    string(2) "::"
    ["args"]=>
    array(0) {
    }
  }
}

1 个答案:

答案 0 :(得分:3)

isset技巧仅在您未明确声明方法为static时才有效。 (因为这正是将 - >对象调用转换为静态调用的原因。)

如果不使用静态修饰符,仍然可以通过class::method()调用方法。