php静态方法问题

php静态方法问题,php,oop,Php,Oop,这两段代码之间有什么区别 class something { static function doit() { echo 'hello world'; } } something::doit(); 相同,但没有static关键字 class something { function doit() { echo 'hello world'; } } something::doit(); 它们的工作原理相同,使用静态关键字更好吗?如果您使用

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

class something {

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

something::doit();
相同,但没有static关键字

class something {

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

something::doit();

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

第二位不应该像您应该调用它那样工作

$something = new something();
$something->doit();
静态函数允许您在类中调用函数,而无需构造它。
因此,基本上如果你有一个类来处理用户,那么让用户登录的函数应该是一个静态函数,因为在该类的构造函数中,你可能会收集用户信息,如果不让他登录,你就不能这样做。

你的第二个例子是错误的。使用静态方法不会创建类的实例。您的第二个示例应该如下所示:

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

第二个例子在技术上是不正确的——如果打开E_STRICT error reporting,您将看到PHP实际上抛出了一个错误

PHP严格标准:非静态 方法something::doit()不应为 在…中静态调用


换句话说,这样做很好,并且允许您无论如何调用函数。

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


看看这个伟大的PHP OOP初学者教程。它在“静态属性和方法”部分下用一个示例进行了更详细的解释。

静态方法应该声明为静态,至少有两个原因:
a) 使用
E\u STRICT
error\u报告时,将非静态方法调用为static将生成错误:
严格标准:不应静态调用非静态方法something::doit()


b) 基于关键字
static
某些IDE的过滤方法,可以自动完成运行

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

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
之间没有关系,除了
B
调用
A
之外。在
A->foo()
中,如果我们执行了
$this instanceof A
(或
$this instanceof self
),它将失败并返回false!很不寻常

现在,我首先认为它是一个bug,但是,它显然是设计的。是的

请注意,如果启用了
E_STRICT
模式,这将不起作用。如果将方法声明为
static
,则它也将不起作用