如何在PHP中签入我是否处于静态上下文中(或不处于静态上下文中)?

2022-08-30 13:17:14

有没有办法检查方法是静态调用的还是在实例化对象上调用的?


答案 1

请尝试以下操作:

class Foo {
   function bar() {
      $static = !(isset($this) && $this instanceof self);
   }
}

来源:seancoates.com 通过谷歌


答案 2

“从debug_backtrace()”中挖掘出来并不是太多的工作。debug_backtrace() 有一个 'type' 成员,如果调用是静态的,则为 '::',如果不是,则为 '->'。所以:

class MyClass {
    public function doStuff() {
        if (self::_isStatic()) {
            // Do it in static context
        } else {
            // Do it in object context
        }
    }

    // This method needs to be declared static because it may be called
    // in static context.
    private static function _isStatic() {
        $backtrace = debug_backtrace();

        // The 0th call is to _isStatic(), so we need to check the next
        // call down the stack.
        return $backtrace[1]['type'] == '::';
    }
}


推荐