Php 确定静态方法是静态调用还是作为实例方法调用
在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)
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