php静态方法问题

时间:2011-02-03 09:55:05

标签: php oop

这两段代码之间有什么区别?

class something {

   static function doit() {
      echo 'hello world';
   }
}

something::doit();

和相同但没有静态关键字

class something {

   function doit() {
      echo 'hello world';
   }
}

something::doit();

它们的工作方式相同是否更好地使用静态关键字?我是否正确理解如果您使用静态方法它不会实例化该类?

6 个答案:

答案 0 :(得分:11)

第二个示例在技术上是不正确的 - 如果您打开E_STRICT错误报告,您将看到PHP实际上是在抛出错误。

  

PHP严格标准:非静态   方法的东西:: doit()不应该是   静静地叫......

换句话说,它很好,让你无论如何都要调用这个函数。

答案 1 :(得分:4)

除了其他有效答案之外,第二个例子工作的原因还在于PHP如何处理对象和调用(除了PHP 4兼容性)。从另一个实例中静态调用非static声明的方法将允许您访问其他类的类方法,就像它们是本地的一样。要理解,让我们举一个例子:

class A {
    public function foo() {
        echo get_class($this) . "\n";
    }
}

class B {
    public function bar() {
        A::foo();
    }
}

$a = new a();
$a->foo(); // "A"
$b = new B();
$b->bar(); // "B"

你看到那里发生了什么吗?因为您从另一个类的实例中调用了A::foo()方法,所以PHP将该调用视为在同一个实例上。请注意,除了A调用B这一事实之外,BA之间没有任何关系。在A->foo()内,如果我们$this instanceof A(或$this instanceof self),则会失败并返回false!很不寻常......

现在,我首先认为这是一个错误,但是after reporting it,它显然是设计。这是even in the docs

请注意,这不适用于启用E_STRICT模式。如果将方法声明为static,它也将无效。

答案 2 :(得分:1)

不同之处在于可以使用静态函数而无需创建类的实例。

看看这个优秀的PHP OOP初学者教程here。它通过静态属性和方法部分下的示例更详细地解释。

答案 3 :(得分:0)

第二位不应该起作用,因为你应该通过

来调用它
$something = new something();
$something->doit();

静态函数允许您在类中调用函数而不构造它。 所以基本上如果你有一个类来处理用户,那么记录用户的函数应该是一个静态函数,因为在该类的构造函数中,你可能会收集用户信息,如果没有登录他就不能这样做。< / p>

答案 4 :(得分:0)

你的第二个例子是错误的。使用静态方法不会创建类的实例。你的第二个例子应该是这样的:

$x = new something();
$x->doit();

答案 5 :(得分:0)

静态方法应声明为静态,至少有两个原因:
a)使用E_STRICT error_reporting时,将非静态方法调用为静态将产生错误:
Strict standards: Non-static method something::doit() should not be called statically
b)基于关键字static某些IDE的过滤方法可以在自动完成时运行。