PHP中的静态方法

don*_*tta 22 php static-methods

为什么在PHP中你可以通过某个类的实例访问静态方法,但不仅仅是通过类型名称?

更新:我是.net开发人员,但我也与PHP开发人员合作.最近我发现了关于从实例调用的静态方法的这一刻,并且无法理解为什么它可以是有用的.

例:

class Foo
{
    public static Bar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以接受这样的方法:

var $foo = new Foo();
$foo.Bar(); // ??????
Run Code Online (Sandbox Code Playgroud)

Ibr*_*mar 34

在PHP中

例如,使用new关键字对类进行实例化;

$MyClass = new MyClass();

并且可以使用范围解析运算符或对象引用运算符来访问静态方法或属性.例如,如果类MyClass包含静态方法,Foo()则可以通过任一方式访问它.

$MyClass->Foo();
Run Code Online (Sandbox Code Playgroud)

要么

MyClass::Foo()
Run Code Online (Sandbox Code Playgroud)

唯一的规则是静态方法或属性不在对象上下文中.例如,您不能$this在静态方法内部使用.

  • @Ibrahim - 实际上,这是不正确的.您可以从类的实例或类本身访问静态和非静态方法.只有当你调用一个静态引用`$ this`的方法时,才会出现错误. (9认同)

小智 14

Class Do {
  static public function test() {
      return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用这样:

echo Do::test();
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 5

为什么在PHP中你可以通过某个类的实例访问静态方法,但不仅仅是通过类型名称?

与您可能习惯使用的.NET不同,PHP具有动态类型.考虑:

class Foo
{
  static public function staticMethod() { }
}

class Bar
{
  static public function staticMethod() { }
}

function doSomething($obj)
{
  // What type is $obj? We don't care.
  $obj->staticMethod();
}

doSomething(new Foo());
doSomething(new Bar());
Run Code Online (Sandbox Code Playgroud)

因此,通过允许通过对象实例访问静态方法,您可以更轻松地跨不同类型调用同名的静态函数.

现在我不知道是否有充分的理由->允许访问静态方法via .PHP(5.3?)还支持:

$obj::staticMethod();
Run Code Online (Sandbox Code Playgroud)

这可能不那么令人困惑.使用时::,它必须是一个静态功能,以避免警告(不同->,它允许).