PHP中的静态方法

时间:2012-02-09 07:09:11

标签: php static-methods

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

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

实施例

class Foo
{
    public static Bar()
    {
    }
}

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

var $foo = new Foo();
$foo.Bar(); // ??????

6 个答案:

答案 0 :(得分:33)

在PHP中

使用new关键字实例化类;

$MyClass = new MyClass();

可以使用范围解析运算符或对象引用运算符来访问静态方法或属性。例如,如果类MyClass包含静态方法Foo(),那么您可以通过任何一种方式访问​​它。

$MyClass->Foo();

MyClass::Foo()

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

答案 1 :(得分:13)

Class Do {
  static public function test() {
      return 0;
  }
}

像这样使用:

echo Do::test();

答案 2 :(得分: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());

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

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

$obj::staticMethod();

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

答案 3 :(得分:0)

在PHP中,虽然您可以通过引用类的实例来访问静态方法,但您并不一定需要这样做。 例如,这是一个带有静态函数的类:

class MyClass{
    public static function  MyFunction($param){
        $mynumber=param*2;
        return $mynumber;
}

您可以通过类似名称访问静态方法,但在这种情况下,您必须使用双冒号(::),而不是" - >"。

$result= MyClass::MyFunction(2);

(请注意,您也可以通过类的实例访问静态方法,使用" - >")。有关详细信息:http://php.net/manual/en/language.oop5.static.php

答案 4 :(得分:0)

在PHP 7中,您似乎绝对有必要能够进行$this->staticFunction()。因为,如果此代码是在抽象类中编写的,并且staticFunction()在抽象类中也是抽象的,则$this->self::会产生不同的结果!

从抽象类的(非抽象)子级执行$this->staticFunction()时,您最终会进入child::staticFunction()。一切都很好。

但是,从抽象类的(非抽象)子级执行self::staticFunction()时,您会遇到parent::staticFunction()(它是抽象的),从而引发异常。

我想这只是设计不良的PHP的另一个示例。 或者我自己需要更多的咖啡...

答案 5 :(得分:0)

有时,如果我们可以在类而不是对象的上下文中访问方法和属性,则很有用。为此,您可以使用static关键字。因此,我们可以使用类名称和范围解析来访问静态方法。

class User

{   公共静态$ name ='john';

public static function display()
 {
return self::$name;
 }

}

echo User :: display();

在这里,我们在User类中声明了一个静态方法。因此,如果我们声明一个静态方法,那么我们可以仅使用类名进行访问。无需创建对象即可访问那里。希望您能理解所有过程。

注意:这实际上是与常规方法的主要区别:$ this在此类方法中不可用。

从此处How to Use Static Properties in PHP ?

阅读全文