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

Php 确定静态方法是静态调用还是作为实例方法调用,php,static,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\u backtrace()似乎表明这两个调用实际上都是静态调用 array(1)

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

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

$a = new A;

A::b();  //foo
$a->b(); //foo
是否有一种方法可以确定
b()
内部是否静态调用了该方法

我尝试了
isset($this)
但在这两种情况下都返回false,
debug\u 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) {
    }
  }
}

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


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

无论如何,为什么需要知道这一点?这两个调用都是静态调用。这是一个静态函数。函数本身不应该有非静态上下文的概念。为什么你认为你需要知道这一点?只是好奇-我在探索PHP=>
Class::method($instance1,$instance2,$param)
vs.
$instance1->method($instance2,$param)
(方法名称相同)中的(伪)重载概念,如果它在一次调用中使用两个参数,在另一次调用中使用三个参数,这种方法可能会根据不同的情况做不同的事情。方法应该只做一件事,因此您应该有两种方法。如果只是为了获取可变数量的参数,请使用
func\u get\u args
这可能的重复应该是一条注释。静态调用非静态方法会根据@Chris:Yep发出严格的通知。您需要在感知到的代码清洁度和功能性之间做出决定。@Gordon