php - 判断一个静态方法是被静态调用还是作为实例方法被调用

标签 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) {
    }
  }
}

最佳答案

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

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

关于php - 判断一个静态方法是被静态调用还是作为实例方法被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484199/

相关文章:

php - 使用实例配置文件凭据签署 S3 上传策略

php - 如何在没有foreach的情况下显示三个表中的记录

php - 当 php 没有可从服务器提取的图像时,如何显示图像?

php - 动态模板表?

java - 大括号下的语句是否首先加载?

java - static HashMap 导致内存泄漏,但是如何纠正它?

c# - 在 asp.net 应用程序中将今天的日期存储为静态值有什么缺点吗?

C++:如何初始化非整数类型的静态成员变量?

php - 方法重载和类继承

c - 静态函数和普通函数中的变量