编程语言
首页 > 编程语言> > 为什么PHP在对象上下文中使用静态方法?

为什么PHP在对象上下文中使用静态方法?

作者:互联网

我有以下代码(例如,实际上,这是我的真实代码):

<?php
class Foobar
{
  public static function foo()
  {
    exit('foo');
  }
}

当我运行$foobar = new FooBar; $foobar-> foo()显示foo.

为什么PHP会尝试在对象上下文中使用静态方法?有办法避免这种情况吗?

好吧,你们没有得到我的问题:我知道静态和非静态方法之间的区别以及如何调用它们.这是我的全部观点,如果我调用$foobar-> foo(),为什么PHP会尝试运行静态方法?

注意:我运行PHP 5.4.4,向E_ALL报告错误.

解决方法:

要调用静态方法,请不要使用:

$foobar = new FooBar;
$foobar->foo()

你打电话

FooBar::foo();

PHP手册说……

Declaring class properties or methods as static makes them accessible
without needing an instantiation of the class. A property declared as
static can not be accessed with an instantiated class object (though a
static method can).

这就是为什么你能够在一个实例上调用该方法的原因,即使这不是你想要做的.

无论是静态调用静态方法还是静态调用实例,都无法在静态方法中访问$this.

http://php.net/manual/en/language.oop5.static.php

你可以检查一下你是否处于静态环境中,虽然我会质疑这是否有点过分……

class Foobar
{
  public static function foo()
  {
    $backtrace = debug_backtrace();
    if ($backtrace[1]['type'] == '::') {
      exit('foo');
    }
  }
}

另外一个注意事项 – 我相信该方法总是在静态上下文中执行,即使它是在实例上调用的.如果我错了,我很高兴能够纠正这个问题.

标签:php,static-methods,magic-methods
来源: https://codeday.me/bug/20191005/1857439.html