这两段代码之间有什么区别?
class something {
static function doit() {
echo 'hello world';
}
}
something::doit();
和相同但没有静态关键字
class something {
function doit() {
echo 'hello world';
}
}
something::doit();
它们的工作方式相同是否更好地使用静态关键字?我是否正确理解如果您使用静态方法它不会实例化该类?
答案 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
这一事实之外,B
和A
之间没有任何关系。在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的过滤方法可以在自动完成时运行。