How do I check in PHP that I'm in a static con

2019-01-11 12:22发布

Is there any way I can check if a method is being called statically or on an instantiated object?

10条回答
够拽才男人
2楼-- · 2019-01-11 13:18

I actually use this line of code on all my scripts,it works well and it prevents errors.

class B{
      private $a=1;
      private static $static=2;

      function semi_static_function(){//remember,don't declare it static
        if(isset($this) && $this instanceof B)
               return $this->a;
        else 
             return self::$static;
      }
}

The use of instanceof is not paranoia:

If class A call class B statically function $this may exist on the A scope; I know it's pretty messed up but php does it.

instanceof will fix that and will avoid conflicting with classes that may implement your "semi-static" functions.

查看更多
姐就是有狂的资本
3楼-- · 2019-01-11 13:23

Checking if $this is set won't work always.

If you call a static method from within an object, then $this will be set as the callers context. If you really want the information, I think you'll have to dig it out of debug_backtrace. But why would you need that in the first place? Chances are you could change the structure of your code in a way so that you don't.

查看更多
劳资没心,怎么记你
4楼-- · 2019-01-11 13:23
<?

class A {
    function test() {
            echo isset($this)?'not static':'static';                                }

}

$a = new A();
$a->test();
A::test();
?>

Edit: beaten to it.

查看更多
兄弟一词,经得起流年.
5楼-- · 2019-01-11 13:27

Just return the class as new within the function.

return new self();
查看更多
登录 后发表回答